Comparar commits

..

1 Commits

Autor SHA1 Mensagem Data
msweet 1810112997 Import cups.org releases
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/tags/release-1.1.20rc6@4306 a1ca3aef-8c08-0410-bb20-df032aa958be
2013-05-10 18:56:23 +00:00
1453 arquivos alterados com 449161 adições e 141891 exclusões
+33
Ver Arquivo
@@ -0,0 +1,33 @@
config.cache
config.h
config.log
config.status
configure
cups-config
cups.list
cups.sh
make.log
printpro.common
printpro.version
Makedefs
aix-4.3-powerpc
darwin-5.2-powerpc
darwin-5.3-powerpc
darwin-6.0-powerpc
freebsd-4.5-intel
hpux-10.20-hppa
hpux-11.00-hppa
irix-5.3-mips
irix-6.5-mips
linux-2.0-intel
linux-2.2-intel
linux-2.4-intel
solaris-2.5-intel
solaris-2.5-sparc
solaris-2.7-intel
solaris-2.7-sparc
solaris-2.8-intel
solaris-2.8-sparc
solaris-2.9-intel
solaris-2.9-sparc
tru64-4.0-alpha
+81
Ver Arquivo
@@ -0,0 +1,81 @@
CGI - CUPS v1.1.19 - 05/27/2003
-------------------------------
This file describes the experimental scripting/CGI support
provided by CUPS starting with CUPS 1.1.19.
WARNING: CGI support is not complete; you may run into problems
and limitations in the implementation of CGI in CUPS that are
not present in full-featured web servers like Apache.
OVERVIEW OF CGI SUPPORT IN CUPS
CUPS has traditionally provided a dynamic web interface through
four CGI programs that are executed when users open special
directories on the CUPS server. Each CGI performs
administration, class, job, and printer functions as directed by
the user, but the actual programs that are run and functions
that are available are limited to those that were originally
designed into the scheduler.
Starting with CUPS 1.1.19, support is now available for CGI
programs and specific scripting languages, currently Java, Perl,
PHP, and Python. The interpreters for these languages are
currently configured at compile time. Future versions may
expand the interface to allow for generic support of scripting
languages similar to the Apache "AddHandler" directive, but with
external programs instead of modules.
The following MIME types are reserved for the CGI support in
CUPS (the names have been chosen to mirror those used by
Apache):
application/x-http-cgi CGI script/program
application/x-http-java Java program
application/x-http-perl Perl script
application/x-http-php PHP script
application/x-http-python Python script
In order to enable the corresponding type, you must create a new
/etc/cups/cgi.types file which maps the filename extensions to
the appropriate MIME type, for example:
application/x-http-cgi cgi
application/x-http-php php
CGI scripts/programs (application/x-http-cgi) also must have
execution permissions to be treated as a CGI script or program.
LIMITATIONS
CUPS implements most of the CGI/1.1 specification, with the
following limitations:
- No Location: redirection support.
- No PATH_INFO or PATH_TRANSLATED support.
- Limited HTTP field support; only the Content-Length
(CONTENT_LENGTH), Cookie (HTTP_COOKIE), and User-Agent
(HTTP_USER_AGENT) fields are placed in environment
variables at this time.
REPORTING PROBLEMS
If you have problems, READ THE DOCUMENTATION FIRST! If the
documentation does not solve your problems please send an email
to "cups-support@cups.org". Include your operating system and
version, compiler and version, and any errors or problems you've
run into. The "/var/log/cups/error_log" file should also be sent,
as it often helps to determine the cause of your problem.
If you are running a version of Linux, be sure to provide the
Linux distribution you have, too.
Please note that the "cups-support@cups.org" email address goes
to the CUPS developers; they are busy people, so your email may
go unanswered for days or weeks. In general, only general build
or distribution problems will actually get answered - for
end-user support see the "README.txt" for a summary of the
resources available.
+3230
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+33
Ver Arquivo
@@ -0,0 +1,33 @@
CREDITS.txt - 04/26/2003
------------------------
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.
L. Peter Deutsch - MD5 code.
Dr. ZP Han - setgid()/setuid().
Guy Harris - *BSD shared libraries and lots of other fixes.
Bjoern Jacke - I18N stuff.
Wang Jian - CUPS RPM corrections.
Roderick Johnstone - Beta tester of the millenium.
Till Kamppeter - Bug fixes, beta testing, evangelism.
Kiko - Bug fixes.
Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester.
Mark Lawrence - Microsoft interoperability testing.
Jeff Licquia - Bug fixes, beta testing, evangelism.
Jason McMullan - Original CUPS RPM distributions.
Wes Morgan - *BSD fixes.
Ulrich Oldendorf - German locale.
Giulio Orsero - Bug fixes and testing.
Kurt Pfeifle - Bug fixes, beta testing, evangelism.
Gilles QUERRET - French man pages.
Petter Reinholdtsen - HP-UX compiler stuff.
Stuart Stevens - HP JetDirect IPP information.
Andrea Suatoni - IRIX desktop integration and testing.
If I've missed someone, please let me know by sending an email to
"mike@easysw.com".
+142
Ver Arquivo
@@ -0,0 +1,142 @@
ENCRYPTION - CUPS v1.1.19 - 05/27/2003
--------------------------------------
This file describes the encryption support provided by CUPS.
WARNING: CLIENTS CURRENTLY TRUST ALL CERTIFICATES FROM SERVERS.
This makes the CUPS client applications vulnerable to "man in
the middle" attacks, so we don't recommend using this to do
remote administration over WANs at this time.
Future versions of CUPS will keep track of server certificates
and provide a callback/confirmation interface for accepting new
certificates and warning when a certificate has changed.
LEGAL STUFF
BEFORE USING THE ENCRYPTION SUPPORT, PLEASE VERIFY THAT IT IS
LEGAL TO DO SO IN YOUR COUNTRY. CUPS by itself doesn't include
any encryption code, but it can link against the OpenSSL, GNU
TLS, or CDSA libraries which do.
OVERVIEW OF ENCRYPTION SUPPORT IN CUPS
CUPS supports SSL/2.0, SSL/3.0, and TLS/1.0 encryption using
keys as large as 128-bits. Encryption support is provided via
the OpenSSL, GNU TLS, or CDSA libraries and some new hooks in
the CUPS code.
CUPS provides support for dedicated (https) and "upgrade" (TLS)
encryption of sessions. The "HTTP Upgrade" method is described
in RFC 2817; basically, the client can be secure or unsecure,
and the client or server initiates an upgrade to a secure
connection via some new HTTP fields and status codes. The HTTP
Upgrade method is new and no browsers we know of support it yet.
Stick with "https" for web browsers.
The current implementation is very basic. The CUPS client
software (lp, lpr, etc.) uses encryption as requested by the
user or server.
The user can specify the "-E" option with the printing commands
to force encryption of the connection. Encryption can also be
specified using the Encryption directive in the client.conf file
or in the CUPS_ENCRYPTION environment variable:
Never
Never do encryption.
Always
Always do SSL/TLS encryption using the https scheme.
IfRequested
Upgrade to TLS encryption if the server asks for it.
This is the default setting.
Required
Always upgrade to TLS encryption as soon as the
connection is made. This is different than the "Always"
mode above since the connection is initially unsecure
and the client initiates the upgrade to TLS encryption.
(same as using the "-E" option)
These keywords are also used in the cupsd.conf file to secure
particular locations. To secure all traffic on the server, listen
on port 443 (https port) instead of port 631 and change the "ipp"
service listing (or add it if you don't have one) in /etc/services
to 443. To provide both secure and normal methods, add a line
reading:
SSLPort 443
to /etc/cups/cupsd.conf.
BEFORE YOU BEGIN
You'll need the OpenSSL, GNU TLS, or CDSA libraries from:
http://www.openssl.org/
http://www.gnutls.org/
http://www.intel.com/labs/archive/cdsa.htm
CONFIGURING WITH ENCRYPTION SUPPORT
Once you have the OpenSSL, GNU TLS, or CDSA libraries installed,
you'll need to configure CUPS to use it with the "--enable-ssl"
option:
./configure --enable-ssl
If the library stuff is not in a standard location, make sure to
define the CFLAGS, CXXFLAGS, and LDFLAGS environment variables
with the appropriate compiler and linker options first.
GENERATING A SERVER CERTIFICATE AND KEY
The following OpenSSL command will generate a server certificate
and key that you can play with. Since the certificate is not
properly signed it will generate all kinds of warnings in
Netscape and MSIE:
openssl req -new -x509 -keyout /etc/cups/ssl/server.key \
-out /etc/cups/ssl/server.crt -days 365 -nodes
chmod 600 /etc/cups/ssl/server.*
The "-nodes" option prevents the certificate and key from being
encrypted. The cupsd process runs in the background, detached
from any input source; if you encrypt these files then cupsd
will not be able to load them!
Send all rants about non-encrypted certificate and key files to
/dev/null. It makes sense to encrypt user files, but not for
files used by system processes/daemons...
REPORTING PROBLEMS
If you have problems, READ THE DOCUMENTATION FIRST! If the
documentation does not solve your problems please send an email
to "cups-support@cups.org". Include your operating system and
version, compiler and version, and any errors or problems you've
run into. The "/var/log/cups/error_log" file should also be sent,
as it often helps to determine the cause of your problem.
If you are running a version of Linux, be sure to provide the
Linux distribution you have, too.
Please note that the "cups-support@cups.org" email address goes
to the CUPS developers; they are busy people, so your email may
go unanswered for days or weeks. In general, only general build
or distribution problems will actually get answered - for
end-user support see the "README.txt" for a summary of the
resources available.
+190
Ver Arquivo
@@ -0,0 +1,190 @@
INSTALL - CUPS v1.1.19 - 05/27/2003
-----------------------------------
This file describes how to compile and install CUPS from source
code. For more information on CUPS see the file called
"README.txt". A complete change log can be found in
"CHANGES.txt".
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO ****
**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION ****
**** OF THE STANDARD GHOSTSCRIPT RELEASES. ****
BEFORE YOU BEGIN
You'll need ANSI-compliant C and C++ compilers, plus a make
program and Bourne shell. The GNU compiler tools work well -
we've tested the current CUPS code against GCC 2.95.x with
excellent results.
The makefiles used by the project should work with all versions
of make. We've tested them with GNU make as well as the make
programs shipped by Compaq, HP, SGI, and Sun. FreeBSD users
should use GNU make (gmake).
Besides these tools you'll want the following libraries:
- JPEG 6b or higher
- PNG 1.0.6 or higher
- TIFF 3.4 or higher
- ZLIB 1.1.3 or higher
CUPS will compile and run without these, however you'll miss out on
many of the features provided by CUPS.
Also, please note that CUPS no longer includes the Ghostscript-
based pstoraster filter. You *must* download Ghostscript
separately and patch it using the files in the pstoraster
subdirectory, or download the ESP Ghostscript distribution from
the CUPS web site. For more information see the README file in
the pstoraster subdirectory.
COMPILING FROM CVS
The CUPS CVS repository doesn't hold a copy of the pre-built
configure script. You'll need to run the GNU autoconf software
(2.52 or higher) before compiling the software from CVS:
autoconf ENTER
CONFIGURATION
CUPS uses GNU autoconf, so you should find the usual "configure"
script in the main CUPS source directory. To configure CUPS for
your system, type:
./configure ENTER
The default installation will put the CUPS software in the
"/etc", "/usr", and "/var" directories on your system, which
will overwrite any existing printing commands on your system.
Use the "--prefix" option to install the CUPS software in
another location:
./configure --prefix=/some/directory ENTER
If the PNG, JPEG, TIFF, and ZLIB libraries are not installed in
a system default location (typically "/usr/include" and
"/usr/lib") you'll need to set the CFLAGS, CXXFLAGS, DSOFLAGS,
and LDFLAGS environment variables prior to running configure:
setenv CFLAGS "-I/some/directory" ENTER
setenv CXXFLAGS "-I/some/directory" ENTER
setenv DSOFLAGS "-L/some/directory" ENTER
setenv LDFLAGS "-L/some/directory" ENTER
./configure ... ENTER
or:
CFLAGS="-I/some/directory"; export CFLAGS ENTER
CXXFLAGS="-I/some/directory"; export CXXFLAGS ENTER
DSOFLAGS="-L/some/directory"; export DSOFLAGS ENTER
LDFLAGS="-L/some/directory"; export LDFLAGS ENTER
./configure ... ENTER
To enable support for encryption, you'll also want to add the
"--enable-ssl" option:
./configure --enable-ssl
SSL and TLS support require the OpenSSL library, available at:
http://www.openssl.org
If the OpenSSL header files and libraries are not in a standard
location, specify the locations of these files using the
--with-openssl-includes and --with-openssl-libs directives:
./configure --enable-ssl \
--with-openssl-includes=/foo/bar/include \
--with-openssl-libs=/foo/bar/lib
See the file "ENCRYPTION.txt" for information on using the
encryption support in CUPS.
Once you have configured things, just type:
make ENTER
or if you have FreeBSD, NetBSD, or OpenBSD type:
gmake ENTER
to build the software.
INSTALLING THE SOFTWARE
Once you have built the software you need to install it. The
"install" target provides a quick way to install the software on
your local system:
make install ENTER
or for FreeBSD, NetBSD, or OpenBSD:
gmake install ENTER
You can also build binary packages that can be installed on other
machines using the RPM spec file ("cups.spec") or EPM list file
("cups.list"). The latter also supports building of binary RPMs,
so it may be more convenient to use - we use EPM to build all of
our binary distributions.
You can find the RPM software at:
http://www.rpm.org
The EPM software is at:
http://www.easysw.com/epm/
CREATING BINARY DISTRIBUTIONS WITH EPM
The top level makefile supports generation of many types of binary
distributions using EPM. To build a binary distribution type:
make <format> ENTER
or
gmake <format> ENTER
for FreeBSD, NetBSD, and OpenBSD. The <format> target is one of
the following:
epm - Builds a portable shell script and tar file based
distribution. This format will also backup your
existing printing system if you decide to remove
CUPS at some future time.
aix - Builds an AIX binary distribution.
bsd - Builds a *BSD binary distribution.
deb - Builds a Debian binary distribution.
depot - Builds a HP-UX binary distribution.
pkg - Builds a Solaris binary distribution.
rpm - Builds a RPM binary distribution.
tardist - Builds an IRIX binary distribution.
REPORTING PROBLEMS
If you have problems, READ THE DOCUMENTATION FIRST! If the
documentation does not solve your problems please send an email
to "cups-support@cups.org". Include your operating system and
version, compiler and version, and any errors or problems you've
run into. The "/var/log/cups/error_log" file should also be sent,
as it often helps to determine the cause of your problem.
If you are running a version of Linux, be sure to provide the
Linux distribution you have, too.
Please note that the "cups-support@cups.org" email address goes
to the CUPS developers; they are busy people, so your email may
go unanswered for days or weeks. In general, only general build
or distribution problems will actually get answered - for
end-user support see the "README.txt" for a summary of the
resources available.
+19
Ver Arquivo
@@ -0,0 +1,19 @@
INSTALL_fr - CUPS v1.1.19 - 04/08/2003
--------------------------------------
Vous cherchez des instructions d'installation ? Lisez le fichier
INSTALL.txt (anglais) et/ou reportez vous au "Manuel de
l'administrateur" (en français) situé dans le sous-répertoire
"doc/fr"
Vous trouverez deux autres manuels en français dans ce
sous-répertoire :
- Aperçu de CUPS
- Manuel de l'utilisateur
Une fois CUPS installé, si vous configurez votre navigateur
"web" pour que la langue de base soit le français, vous
disposerez également d'une interface "web" en français pour
l'administration et d'utilistation de CUPS.
+909 -221
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+823 -185
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+113 -36
Ver Arquivo
@@ -3,9 +3,7 @@
#
# Common makefile definitions for the Common UNIX Printing System (CUPS).
#
# @configure_input@
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -16,7 +14,7 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
@@ -28,17 +26,54 @@
# Programs...
#
AR = @AR@
AWK = @AWK@
CC = @CC@
CP = @CP@
HTMLDOC = @HTMLDOC@
LN = /bin/ln -sf
MKDIR = @MKDIR@ -p
NROFF = @GROFF@ -T ascii
RANLIB = @RANLIB@
RM = @RM@ -f
SHELL = /bin/sh
AR = @AR@
AWK = @AWK@
CC = @LIBTOOL@ @CC@
CXX = @LIBTOOL@ @CXX@
DSO = @DSO@
HTMLDOC = @HTMLDOC@
INSTALL = @INSTALL@
LIBTOOL = @LIBTOOL@
LN = @LN@ -sf
MV = @MV@
NROFF = @NROFF@
RANLIB = @RANLIB@
RM = @RM@ -f
SED = @SED@
SHELL = /bin/sh
STRIP = @STRIP@
#
# Installation programs...
#
INSTALL_BIN = $(LIBTOOL) $(INSTALL) -m 755 -s
INSTALL_DATA = $(INSTALL) -m 644
INSTALL_DIR = $(INSTALL) -d
INSTALL_LIB = $(LIBTOOL) $(INSTALL) -m 755
INSTALL_MAN = $(INSTALL) -m 644
INSTALL_SCRIPT = $(INSTALL) -m 755
#
# Default user and group for the scheduler...
#
CUPS_USER = @CUPS_USER@
CUPS_GROUP = @CUPS_GROUP@
#
# Libraries...
#
LIBCUPS = @LIBCUPS@
LIBCUPSIMAGE = @LIBCUPSIMAGE@
LIBJPEG = @LIBJPEG@
LIBMALLOC = @LIBMALLOC@
LIBPAPER = @LIBPAPER@
LIBPNG = @LIBPNG@
LIBSLP = @LIBSLP@
LIBTIFF = @LIBTIFF@
LIBZ = @LIBZ@
#
# Program options...
@@ -48,13 +83,25 @@ SHELL = /bin/sh
# extra debug info)
#
ARFLAGS = crvs
CFLAGS = @CFLAGS@ $(OPTIM) -I.. $(OPTIONS)
IMGLIBS = @IMGLIBS@ $(LIBS) -lm
LDFLAGS = @LDFLAGS@ $(OPTIM)
LIBS = @LIBS@ -L../cups -lcups
OPTIM = @OPTIM@
OPTIONS =
ARFLAGS = @ARFLAGS@
BACKLIBS = @BACKLIBS@
CFLAGS = $(RC_CFLAGS) $(SSLFLAGS) @CPPFLAGS@ @CFLAGS@ -I.. $(OPTIONS)
COMMONLIBS = @COMMONLIBS@
CXXFLAGS = $(RC_CFLAGS) @CPPFLAGS@ @CXXFLAGS@ -I.. $(OPTIONS)
CXXLIBS = @CXXLIBS@
DSOFLAGS = @DSOFLAGS@
DSOLIBS = @DSOLIBS@ $(COMMONLIBS)
IMGLIBS = @IMGLIBS@ -lm
LDFLAGS = -L../cups -L../filter $(RC_CFLAGS) @LDFLAGS@ $(OPTIM)
LINKCUPS = @LINKCUPS@
LINKCUPSIMAGE = @LINKCUPSIMAGE@
LIBS = $(LINKCUPS) $(NETLIBS) @LIBS@ $(COMMONLIBS)
NETLIBS = @NETLIBS@
OPTIM = @OPTIM@
OPTIONS =
PAMLIBS = @PAMLIBS@
SSLFLAGS = @SSLFLAGS@
SSLLIBS = @SSLLIBS@
#
# Directories...
@@ -85,26 +132,56 @@ srcdir = @srcdir@
sysconfdir = @sysconfdir@
top_srcdir = @top_srcdir@
BINDIR = @bindir@
DATADIR = @CUPS_DATADIR@
INCLUDEDIR = $(includedir)/cups
LIBDIR = $(libdir)
LOCALEDIR = @CUPS_LOCALEDIR@
MANDIR = @mandir@
SBINDIR = @sbindir@
SERVERROOT = @CUPS_SERVERROOT@
BUILDROOT = $(DSTROOT)
AMANDIR = $(BUILDROOT)@AMANDIR@
BINDIR = $(BUILDROOT)@bindir@
DATADIR = $(BUILDROOT)@CUPS_DATADIR@
DOCDIR = $(BUILDROOT)@CUPS_DOCROOT@
INCLUDEDIR = $(BUILDROOT)$(includedir)
INITDIR = @INITDIR@
INITDDIR = @INITDDIR@
LIBDIR = $(BUILDROOT)$(libdir)
LOCALEDIR = $(BUILDROOT)@CUPS_LOCALEDIR@
LOGDIR = $(BUILDROOT)@CUPS_LOGDIR@
MANDIR = $(BUILDROOT)@mandir@
PAMDIR = $(BUILDROOT)@PAMDIR@
PMANDIR = $(BUILDROOT)@PMANDIR@
REQUESTS = $(BUILDROOT)@CUPS_REQUESTS@
SBINDIR = $(BUILDROOT)@sbindir@
SERVERBIN = $(BUILDROOT)@CUPS_SERVERBIN@
SERVERROOT = $(BUILDROOT)@CUPS_SERVERROOT@
CAT1EXT = @CAT1EXT@
CAT3EXT = @CAT3EXT@
CAT5EXT = @CAT5EXT@
CAT8EXT = @CAT8EXT@
MAN8EXT = @MAN8EXT@
MAN8DIR = @MAN8DIR@
#
# Rules...
#
.SUFFIXES: .a .c .h .1 .2 .3 .4 .5 .6 .7 .8 .o .z
.SILENT:
.SUFFIXES: .a .c .cxx .h .man .o .0 .1 .1m .3 .5 .8 .z
.c.o:
$(CC) $(CFLAGS) -c $<
.1.z .2.z .3.z .4.z .5.z .6.z .7.z .8.z:
$(NROFF) -man $< >t
pack -f t
mv t.z $@
echo Compiling $<...
$(CC) $(OPTIM) $(CFLAGS) -c $<
.cxx.o:
echo Compiling $<...
$(CXX) $(OPTIM) $(CXXFLAGS) -c $<
.man.0 .man.1 .man.1m .man.3 .man.5 .man.8:
echo Formatting $<...
$(RM) $@
-$(NROFF) -man $< >$@
.man.z:
echo Formatting $<...
$(RM) $@ $@.tmp $@.tmp.z
-$(NROFF) -man $< >$@.tmp
pack -f $@.tmp
$(MV) $@.tmp.z $@
#
# End of "$Id$"
+114 -12
Ver Arquivo
@@ -3,7 +3,7 @@
#
# Top-level Makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -14,7 +14,7 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
@@ -28,7 +28,7 @@ include Makedefs
# Directories to make...
#
DIRS = cups backend berkeley cgi-bin filter man pstoraster \
DIRS = cups backend berkeley cgi-bin filter man pdftops \
scheduler systemv
#
@@ -36,8 +36,10 @@ DIRS = cups backend berkeley cgi-bin filter man pstoraster \
#
all:
chmod +x cups-config
for dir in $(DIRS); do\
(cd $$dir; make);\
echo Making all in $$dir... ;\
(cd $$dir ; $(MAKE) $(MFLAGS)) || exit 1;\
done
#
@@ -46,22 +48,122 @@ all:
clean:
for dir in $(DIRS); do\
(cd $$dir; make clean);\
echo Cleaning in $$dir... ;\
(cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\
done
#
# Make dependencies
#
depend:
for dir in $(DIRS); do\
echo Making dependencies in $$dir... ;\
(cd $$dir; $(MAKE) $(MFLAGS) depend) || exit 1;\
done
#
# Install object and target files...
#
install:
install: installhdrs
for dir in $(DIRS); do\
(cd $$dir; make install);\
echo Installing in $$dir... ;\
(cd $$dir; $(MAKE) $(MFLAGS) install) || exit 1;\
done
(cd conf; make install)
(cd data; make install)
(cd doc; make install)
(cd fonts; make install)
(cd ppd; make install)
echo Installing in conf...
(cd conf; $(MAKE) $(MFLAGS) install)
echo Installing in data...
(cd data; $(MAKE) $(MFLAGS) install)
echo Installing in doc...
(cd doc; $(MAKE) $(MFLAGS) install)
echo Installing in fonts...
(cd fonts; $(MAKE) $(MFLAGS) install)
echo Installing in locale...
(cd locale; $(MAKE) $(MFLAGS) install)
echo Installing in ppd...
(cd ppd; $(MAKE) $(MFLAGS) install)
echo Installing in templates...
(cd templates; $(MAKE) $(MFLAGS) install)
echo Installing cups-config script...
$(INSTALL_DIR) $(BINDIR)
$(INSTALL_SCRIPT) cups-config $(BINDIR)/cups-config
echo Installing startup script...
if test "x$(INITDIR)" != "x"; then \
$(INSTALL_DIR) $(BUILDROOT)$(INITDIR)/init.d; \
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDIR)/init.d/cups; \
$(INSTALL_DIR) $(BUILDROOT)$(INITDIR)/rc0.d; \
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDIR)/rc0.d/K00cups; \
$(INSTALL_DIR) $(BUILDROOT)$(INITDIR)/rc2.d; \
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDIR)/rc2.d/S99cups; \
$(INSTALL_DIR) $(BUILDROOT)$(INITDIR)/rc3.d; \
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDIR)/rc3.d/S99cups; \
$(INSTALL_DIR) $(BUILDROOT)$(INITDIR)/rc5.d; \
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDIR)/rc5.d/S99cups; \
fi
if test "x$(INITDIR)" = "x" -a "x$(INITDDIR)" != "x"; then \
$(INSTALL_DIR) $(BUILDROOT)$(INITDDIR); \
if test "$(INITDDIR)" = "/System/Library/StartupItems/PrintingServices"; then \
$(INSTALL_SCRIPT) cups.osx $(BUILDROOT)$(INITDDIR)/PrintingServices; \
$(INSTALL_DATA) cups.plist $(BUILDROOT)$(INITDDIR)/StartupParameters.plist; \
$(INSTALL_DIR) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj; \
$(INSTALL_DATA) cups.strings $(BUILDROOT)$(INITDDIR)/Resources/English.lproj/Localizable.strings; \
else \
$(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/cups; \
fi \
fi
#
# Install source and header files...
#
installsrc:
gnutar --dereference --exclude=CVS -cf - . | gnutar -C $(SRCROOT) -xf -
installhdrs:
(cd cups ; $(MAKE) $(MFLAGS) installhdrs) || exit 1;\
(cd filter ; $(MAKE) $(MFLAGS) installhdrs) || exit 1;
#
# Run the test suite...
#
check test: all
echo Running CUPS test suite...
cd test; ./run-stp-tests.sh
#
# Make software distributions using EPM (http://www.easysw.com/epm)...
#
EPMFLAGS = -v
aix:
epm $(EPMFLAGS) -f aix cups
bsd:
epm $(EPMFLAGS) -f bsd cups
epm:
epm $(EPMFLAGS) cups
rpm:
epm $(EPMFLAGS) -f rpm cups
deb:
epm $(EPMFLAGS) -f deb cups
depot:
epm $(EPMFLAGS) -f depot cups
pkg:
epm $(EPMFLAGS) -f pkg cups
tardist:
epm $(EPMFLAGS) -f tardist cups
#
# End of "$Id$".
-243
Ver Arquivo
@@ -1,243 +0,0 @@
<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&reg; 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 (&quot;PPD&quot;)-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&reg; Windows&reg;.
<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 &amp; 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>
+226 -135
Ver Arquivo
@@ -1,192 +1,283 @@
README - CUPS v1.0b1
README - CUPS v1.1.19 - 05/27/2003
----------------------------------
CONTENTS
Looking for compile instructions? Read the file "INSTALL.txt"
instead...
**** IF YOU HAVE A NON-POSTSCRIPT PRINTER, YOU WILL ALSO ****
**** NEED TO INSTALL ESP GHOSTSCRIPT OR A PATCHED VERSION ****
**** OF THE STANDARD GHOSTSCRIPT RELEASES. ****
* Introduction
* 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.
CUPS provides a portable printing layer for UNIX(r)-based
operating systems. It has been developed by Easy Software
Products to promote a standard printing solution for all UNIX
vendors and users. CUPS provides the System V and Berkeley
command-line interfaces.
CUPS uses the Internet Printing Protocol (IETF-IPP) as the basis for
managing print jobs and queues. The Line Printer Daemon (LPD, RFC1179),
Server Message Block (SMB), and AppSocket protocols are also supported with
reduced functionality.
CUPS uses the Internet Printing Protocol ("IPP") as the basis
for managing print jobs and queues. The Line Printer Daemon
("LPD") Server Message Block ("SMB"), and AppSocket (a.k.a.
JetDirect) protocols are also supported with reduced
functionality. CUPS adds network printer browsing and
PostScript Printer Description ("PPD") based printing options to
support real-world printing under UNIX.
CUPS adds network printer browsing and PostScript Printer Description
("PPD")-based printing options to support real world applications under
UNIX.
CUPS includes an image file RIP that supports printing of image
files to non-PostScript printers. A customized version of GNU
Ghostscript 7.05 for CUPS called ESP Ghostscript is available
separately to support printing of PostScript files within the
CUPS driver framework. Sample drivers for Dymo, EPSON, HP, and
OKIDATA printers are included that use these filters.
CUPS also includes a customized version of GNU GhostScript (currently based
off GNU GhostScript 4.03) and an image file RIP that can be used to support
non-PostScript printers.
Drivers for thousands of printers are provided with our ESP
Print Pro software, available at:
REQUIREMENTS
http://www.easysw.com/printpro
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®.
CUPS is licensed under the GNU General Public License and GNU
Library General Public License. Please contact Easy Software
Products for commercial support and "binary distribution"
rights.
For the image file filters you'll need the JPEG, PNG, TIFF, and ZLIB
libraries. CUPS will build without these, but with reduced functionality.
If you make changes to the man pages you'll need GNU groff or another
nroff-like package.
SYSTEM REQUIREMENTS
The documentation is formatted using the HTMLDOC software (again, not needed
unless you make changes.)
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.
COMPILING CUPS
If you are installing from source you'll need ANSI-compliant C
and C++ compilers and optionally one or more image file support
libraries. Complete source installation instructions can be
found in the file "INSTALL.txt".
CUPS uses GNU autoconf to configure the makefiles and source code for your
system. To configure CUPS for your system type:
% ./configure ENTER
SOFTWARE REQUIREMENTS
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:
The following operating system software is required to install
one of the binary distributions from Easy Software Products:
% ./configure --prefix=/usr/local ENTER
- AIX 4.3 or higher
- Compaq Tru64 UNIX (aka OSF1 aka Digital 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)
Once you have configured things, just type:
% make ENTER
INSTALLING "PORTABLE" CUPS DISTRIBUTIONS
to build the software.
We are currently distributing "portable" CUPS binary
distributions in TAR format with installation and removal
scripts generated by our ESP Package Manager (EPM) software,
which is available from:
INSTALLING THE SOFTWARE
http://www.easysw.com/epm
To install the software type:
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.
% make install ENTER
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:
CONFIGURING THE SOFTWARE
./cups.install ENTER
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.
After asking you a few yes/no questions the CUPS software will
be installed and the scheduler will be started automatically.
The cupsd.conf file configures all of the "global" server settings and
access control. The default settings are usually appropriate for most
environments.
The printers.conf file configures each printer queue. You'll need to
add a listing for each printer on your system.
INSTALLING HOST-SPECIFIC (RPM, DEBIAN, ETC.) DISTRIBUTIONS
The classes.conf file configures each printer class. You'll need to add
a listing for each printer class you want.
The host-specific distributions use the operating system
software installation tools. To install a host-specific
distribution please consult the CUPS Software Administrators
Manual or your operating system documentation.
The mime.types file defines all of the recognized file types. You don't
normally have to edit this file.
The mime.convs file defines all of the file conversion filters. You
don't normally have to edit this file.
READING THE DOCUMENTATION
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.
Once you have installed the software you can access the
documentation (and a bunch of other stuff) on-line at:
RUNNING THE SOFTWARE
http://localhost:631
Once you have configured the software you can start the CUPS daemon by
typing:
If you're having trouble getting that far, the documentation is
located in the "/usr/share/doc/cups" directory in the binary
distributions, and under the "doc" directory in the source
archives.
% /usr/sbin/cupsd & ENTER
Please read the documentation before asking questions.
USING THE SOFTWARE
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.
GETTING SUPPORT AND OTHER RESOURCES
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!
If you have problems, READ THE DOCUMENTATION FIRST!
You can monitor the status of jobs via the lpstat command or with your web
browser by pointing it at "http://localhost:631".
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.
KNOWN PROBLEMS
Commercial support (with a guaranteed response time) is
available from Easy Software Products. For more information
see:
The following known problems are being worked on and should be resolved for
the second beta release of CUPS:
http://www.easysw.com/cups
* 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.
See the CUPS web site at "http://www.cups.org" for other site
links.
CUPS has been built and tested on the following operating systems:
* 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)
SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER
The client libraries and filters have been successfully compiled under
Microsoft Windows using Visual C++ 6.0.
CUPS 1.1 includes a new web-based administration tool that
allows you to manage printers, classes, and jobs on your
server. To access the printer administration tools open the
following URL in your browser:
REPORTING PROBLEMS
http://localhost:631/admin
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.
You will be asked for the administration password (root or any
other user in the sys/system/root group on your system) and then
shown a menu of available functions.
OTHER RESOURCES
DO NOT use the hostname for your machine - it will not work with
the default CUPS configuration. To enable administration access
on other addresses, consult the CUPS Software Administrators
Manual.
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.
SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE
CUPS works best with PPD (PostScript Printer Description)
files. In a pinch you can also use System V style printer
interface scripts.
Six sample PPD files are provided with this distribution that
utilize the PostScript and image file RIPs and the sample EPSON
and HP printer drivers. To add the sample DeskJet driver to the
system for a printer connected to the parallel port, use one of
the following commands:
Digital UNIX:
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E
HP-UX:
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/c2t0d0_lp -E
IRIX:
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/plp -E
Linux:
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp0 -E
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp1 -E
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/lp2 -E
Solaris:
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/bpp0 -E
/usr/lib/lpadmin -p DeskJet -m deskjet.ppd -v parallel:/dev/ecpp0 -E
Similarly, for the other sample drivers you can use:
Driver PPD File
----------------------------- ------------
Dymo Label Printers dymo.ppd
EPSON Stylus Color Series stcolor.ppd
EPSON Stylus Photo Series stphoto.ppd
EPSON Stylus New Color Series stcolor2.ppd
EPSON Stylus New Photo Series stphoto2.ppd
EPSON 9-pin Series epson9.ppd
EPSON 24-pin Series epson24.ppd
HP DeskJet Series deskjet.ppd
HP New DeskJet Series deskjet2.ppd
HP LaserJet Series laserjet.ppd
OKIDATA 9-Pin Series okidata9.ppd
OKIDATA 24-Pin Series okidat24.ppd
These sample drivers provide basic printing capabilities, but
generally do not exercise the full potential of the printers or
CUPS. For commercial printer drivers check out our ESP Print
Pro software at:
http://www.easysw.com/printpro
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 PDF,
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.
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-2003 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 Aladdin Free Public License which is
located in the files "LICENSE.html" and "LICENSE.txt". For commercial
licensing information, please contact:
The MD5 Digest code is Copyright 1999 Aladdin Enterprises.
Attn: CUPS Licensing Information
Easy Software Products
44141 Airport View Drive, Suite 204
Hollywood, Maryland 20636-3111 USA
The PDF filter (pdftops) is based on the Xpdf software,
Copyright 1996-2002 by Derek B. Noonburg.
Voice: +1.301.373.9603
Email: cups-info@cups.org
WWW: http://www.cups.org
This software is based in part on the work of the Independent
JPEG Group.
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.
CUPS is provided under the terms of the GNU General Public
License and GNU Library General Public License. This program is
distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the "LICENSE.html",
"LICENSE.txt", or "cups.license" files for more information.
For commercial licensing information, please contact:
Attn: CUPS Licensing Information
Easy Software Products
44141 Airport View Drive, Suite 204
Hollywood, Maryland 20636-3111 USA
Voice: +1.301.373.9600
Email: cups-info@cups.org
WWW: http://www.cups.org
Note that commercial licensors may also require a license from
Derek B. Noonburg who developed the Xpdf software used to print
PDF files.
+19
Ver Arquivo
@@ -0,0 +1,19 @@
README_fr - CUPS v1.1.19 - 04/08/2003
-------------------------------------
Vous cherchez des instructions d'installation ? Lisez le fichier
INSTALL.txt (anglais) et/ou reportez vous au "Manuel de
l'administrateur" (en français) situé dans le sous-répertoire
"doc/fr"
Vous trouverez deux autres manuels en français dans ce
sous-répertoire :
- Aperçu de CUPS
- Manuel de l'utilisateur
Une fois CUPS installé, si vous configurez votre navigateur
"web" pour que la langue de base soit le français, vous
disposerez également d'une interface "web" en français pour
l'administration et d'utilistation de CUPS.
+8
Ver Arquivo
@@ -0,0 +1,8 @@
betest
ipp
lpd
parallel
scsi
serial
socket
usb
+17
Ver Arquivo
@@ -0,0 +1,17 @@
# DO NOT DELETE
betest.o: ../cups/string.h ../config.h
ipp.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
ipp.o: ../cups/ppd.h ../cups/language.h ../cups/string.h ../config.h
lpd.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
lpd.o: ../cups/ppd.h ../cups/string.h ../config.h
parallel.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
parallel.o: ../cups/ppd.h ../cups/string.h ../config.h
scsi.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
scsi.o: ../cups/ppd.h ../cups/string.h ../config.h
serial.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
serial.o: ../cups/ppd.h ../cups/string.h ../config.h
socket.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
socket.o: ../cups/ppd.h ../cups/string.h ../config.h
usb.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
usb.o: ../cups/ppd.h ../cups/string.h ../config.h
+83 -26
Ver Arquivo
@@ -3,7 +3,7 @@
#
# Backend makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -14,18 +14,22 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
# This file is subject to the Apple OS-Developed Software exception.
#
include ../Makedefs
TARGETS = lpd parallel serial smb socket
OBJS = lpd.o parallel.o serial.o smb.o socket.o
BACKENDS = ipp lpd parallel scsi serial socket usb
TARGETS = betest $(BACKENDS)
OBJS = betest.o ipp.o lpd.o parallel.o scsi.o serial.o socket.o usb.o
#
# Make all targets...
@@ -33,65 +37,118 @@ OBJS = lpd.o parallel.o serial.o smb.o socket.o
all: $(TARGETS)
#
# Clean all object files...
#
clean:
rm -f $(OBJS) $(TARGETS)
$(RM) $(OBJS) $(TARGETS) http
#
# Update dependencies (without system header dependencies...)
#
depend:
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
#
# Install all targets...
#
install:
-$(MKDIR) $(SERVERROOT)/backend
$(CP) $(TARGETS) $(SERVERROOT)/backend
install: all
$(INSTALL_DIR) $(SERVERBIN)/backend
for file in $(BACKENDS); do \
$(INSTALL_BIN) $$file $(SERVERBIN)/backend; \
done
$(RM) $(SERVERBIN)/backend/http
$(LN) ipp $(SERVERBIN)/backend/http
#
# betest
#
betest: betest.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o betest betest.o $(LIBS)
#
# ipp
#
ipp: ipp.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o ipp ipp.o $(LIBS)
$(RM) http
$(LN) ipp http
#
# lpd
#
lpd: lpd.o ../cups/libcups.a
lpd: lpd.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o lpd lpd.o $(LIBS)
lpd.o: ../cups/cups.h ../Makedefs
#
# parallel
#
parallel: parallel.o ../cups/libcups.a
parallel: parallel.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o parallel parallel.o $(LIBS)
parallel.o: ../cups/cups.h ../Makedefs
#
# scsi
#
scsi: scsi.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o scsi scsi.o $(LIBS)
scsi.o: scsi.c scsi-irix.c scsi-linux.c
#
# serial
#
serial: serial.o ../cups/libcups.a
$(CC) $(LDFLAGS) -o serial serial.o $(LIBS)
serial: serial.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(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.a
socket: socket.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o socket socket.o $(LIBS)
socket.o: ../cups/cups.h ../Makedefs
#
# usb
#
usb: usb.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o usb usb.o $(BACKLIBS) $(LIBS)
#
# Dependencies...
#
include Dependencies
#
# End of "$Id$".
+87
Ver Arquivo
@@ -0,0 +1,87 @@
/*
* "$Id$"
*
* Backend test program for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* main() - Run the named backend.
*/
/*
* Include necessary headers.
*/
#include <stdio.h>
#include <stdlib.h>
#include <cups/string.h>
#include <unistd.h>
/*
* 'main()' - Run the named backend.
*
* Usage:
*
* betest device-uri job-id user title copies options [file]
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments (7 or 8) */
char *argv[]) /* I - Command-line arguments */
{
char backend[255]; /* Method in URI */
if (argc < 7 || argc > 8)
{
fputs("Usage: betest device-uri job-id user title copies options [file]\n",
stderr);
return (1);
}
/*
* Extract the method from the device-uri - that's the program we want to
* execute.
*/
if (sscanf(argv[1], "%254[^:]", backend) != 1)
{
fputs("betest: Bad device-uri - no colon!\n", stderr);
return (1);
}
/*
* Execute and return
*/
execl(backend, argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7],
NULL);
return (1);
}
/*
* End of "$Id$".
*/
+1211
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+772 -168
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+529 -29
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Parallel port backend for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -14,16 +14,19 @@
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44145 Airport View Drive, Suite 204
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* main() - Send a file to the specified parallel port.
* main() - Send a file to the specified parallel port.
* list_devices() - List all parallel devices.
*/
/*
@@ -33,15 +36,35 @@
#include <cups/cups.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cups/string.h>
#include <signal.h>
#if defined(WIN32) || defined(__EMX__)
#ifdef WIN32
# include <io.h>
#else
# include <unistd.h>
# include <fcntl.h>
# include <termios.h>
#endif /* WIN32 || __EMX__ */
#endif /* WIN32 */
#ifdef __sgi
# include <invent.h>
# ifndef INV_EPP_ECP_PLP
# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */
# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */
# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */
# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */
# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */
# endif /* !INV_EPP_ECP_PLP */
#endif /* __sgi */
/*
* Local functions...
*/
void list_devices(void);
/*
@@ -62,16 +85,50 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
resource[1024], /* Resource info (device and options) */
*options; /* Pointer to options */
int port; /* Port number (not used) */
FILE *fp; /* Print file */
int fp; /* Print file */
int copies; /* Number of copies to print */
int fd; /* Parallel device */
int error; /* Error code (if any) */
size_t nbytes, /* Number of bytes written */
int wbytes; /* Number of bytes written */
size_t nbytes, /* Number of bytes read */
tbytes; /* Total number of bytes written */
char buffer[8192]; /* Output buffer */
char buffer[8192], /* Output buffer */
*bufptr; /* Pointer into buffer */
struct termios opts; /* Parallel port options */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
if (argc < 6 || argc > 7)
/*
* Make sure status messages are not buffered...
*/
setbuf(stderr, NULL);
/*
* Ignore SIGPIPE signals...
*/
#ifdef HAVE_SIGSET
sigset(SIGPIPE, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &action, NULL);
#else
signal(SIGPIPE, SIG_IGN);
#endif /* HAVE_SIGSET */
/*
* Check command-line...
*/
if (argc == 1)
{
list_devices();
return (0);
}
else if (argc < 6 || argc > 7)
{
fputs("Usage: parallel job-id user title copies options [file]\n", stderr);
return (1);
@@ -83,18 +140,23 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
if (argc == 6)
fp = stdin;
{
fp = 0;
copies = 1;
}
else
{
/*
* Try to open the print file...
*/
if ((fp = fopen(argv[6], "rb")) == NULL)
if ((fp = open(argv[6], O_RDONLY)) < 0)
{
perror("ERROR: unable to open print file");
return (1);
}
copies = atoi(argv[4]);
}
/*
@@ -121,11 +183,29 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Open the parallel port device...
*/
if ((fd = open(resource, O_WRONLY)) == -1)
do
{
perror("ERROR: Unable to open parallel port device file");
return (1);
if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1)
{
if (errno == EBUSY)
{
fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
{
fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else
{
fprintf(stderr, "ERROR: Unable to open parallel port device file \"%s\": %s\n",
resource, strerror(errno));
return (1);
}
}
}
while (fd < 0);
/*
* Set any options provided...
@@ -139,27 +219,75 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
tcsetattr(fd, TCSANOW, &opts);
/*
* Now that we are "connected" to the port, ignore SIGTERM so that we
* can finish out any page data the driver sends (e.g. to eject the
* current page... Only ignore SIGTERM if we are printing data from
* stdin (otherwise you can't cancel raw jobs...)
*/
if (argc < 7)
{
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
#else
signal(SIGTERM, SIG_IGN);
#endif /* HAVE_SIGSET */
}
/*
* Finally, send the print file...
*/
tbytes = 0;
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
while (copies > 0)
{
/*
* Write the print data to the printer...
*/
copies --;
if (write(fd, buffer, nbytes) < nbytes)
if (fp != 0)
{
perror("ERROR: Unable to send print file to printer");
break;
fputs("PAGE: 1 1\n", stderr);
lseek(fp, 0, SEEK_SET);
}
else
tbytes += nbytes;
if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
tbytes = 0;
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
{
/*
* Write the print data to the printer...
*/
tbytes += nbytes;
bufptr = buffer;
while (nbytes > 0)
{
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
if (errno == ENOTTY)
wbytes = write(fd, bufptr, nbytes);
if (wbytes < 0)
{
perror("ERROR: Unable to send print file to printer");
break;
}
nbytes -= wbytes;
bufptr += wbytes;
}
if (wbytes < 0)
break;
if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
(unsigned long)tbytes);
}
}
/*
@@ -167,13 +295,385 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
close(fd);
if (fp != stdin)
fclose(fp);
if (fp != 0)
close(fp);
fputs("INFO: Ready to print.\n", stderr);
return (0);
}
/*
* 'list_devices()' - List all parallel devices.
*/
void
list_devices(void)
{
#if defined(__hpux) || defined(__sgi) || defined(__sun)
static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz";
/* Funky hex numbering used for some devices */
#endif /* __hpux || __sgi || __sun */
#ifdef __linux
int i; /* Looping var */
int fd; /* File descriptor */
char device[255], /* Device filename */
probefile[255], /* Probe filename */
basedevice[255]; /* Base device filename for ports */
FILE *probe; /* /proc/parport/n/autoprobe file */
char line[1024], /* Line from file */
*delim, /* Delimiter in file */
make[IPP_MAX_NAME], /* Make from file */
model[IPP_MAX_NAME]; /* Model from file */
for (i = 0; i < 4; i ++)
{
/*
* First open the device to make sure the driver module is loaded...
*/
if ((fd = open("/dev/parallel/0", O_WRONLY)) >= 0)
{
close(fd);
strcpy(basedevice, "/dev/parallel/");
}
else
{
sprintf(device, "/dev/lp%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
strcpy(basedevice, "/dev/lp");
}
else
{
sprintf(device, "/dev/par%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
strcpy(basedevice, "/dev/par");
}
else
{
sprintf(device, "/dev/printers/%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
strcpy(basedevice, "/dev/printers/");
}
else
strcpy(basedevice, "/dev/unknown-parallel");
}
}
}
/*
* Then try looking at the probe file...
*/
sprintf(probefile, "/proc/parport/%d/autoprobe", i);
if ((probe = fopen(probefile, "r")) == NULL)
{
/*
* Linux 2.4 kernel has different path...
*/
sprintf(probefile, "/proc/sys/dev/parport/parport%d/autoprobe", i);
probe = fopen(probefile, "r");
}
if (probe != NULL)
{
/*
* Found a probe file!
*/
memset(make, 0, sizeof(make));
memset(model, 0, sizeof(model));
strcpy(model, "Unknown");
while (fgets(line, sizeof(line), probe) != NULL)
{
/*
* Strip trailing ; and/or newline.
*/
if ((delim = strrchr(line, ';')) != NULL)
*delim = '\0';
else if ((delim = strrchr(line, '\n')) != NULL)
*delim = '\0';
/*
* Look for MODEL and MANUFACTURER lines...
*/
if (strncmp(line, "MODEL:", 6) == 0 &&
strncmp(line, "MODEL:Unknown", 13) != 0)
strlcpy(model, line + 6, sizeof(model));
else if (strncmp(line, "MANUFACTURER:", 13) == 0 &&
strncmp(line, "MANUFACTURER:Unknown", 20) != 0)
strlcpy(make, line + 13, sizeof(make));
}
fclose(probe);
if (make[0])
printf("direct parallel:%s%d \"%s %s\" \"Parallel Port #%d\"\n",
basedevice, i, make, model, i + 1);
else
printf("direct parallel:%s%d \"%s\" \"Parallel Port #%d\"\n",
basedevice, i, model, i + 1);
}
else if (fd >= 0)
{
/*
* No probe file, but we know the port is there...
*/
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
}
}
#elif defined(__sgi)
int i, j, n; /* Looping vars */
char device[255]; /* Device filename */
inventory_t *inv; /* Hardware inventory info */
/*
* IRIX maintains a hardware inventory of most devices...
*/
setinvent();
while ((inv = getinvent()) != NULL)
{
if (inv->inv_class == INV_PARALLEL &&
(inv->inv_type == INV_ONBOARD_PLP ||
inv->inv_type == INV_EPP_ECP_PLP))
{
/*
* Standard parallel port...
*/
puts("direct parallel:/dev/plp \"Unknown\" \"Onboard Parallel Port\"");
}
else if (inv->inv_class == INV_PARALLEL &&
inv->inv_type == INV_EPC_PLP)
{
/*
* EPC parallel port...
*/
printf("direct parallel:/dev/plp%d \"Unknown\" \"Integral EPC parallel port, Ebus slot %d\"\n",
inv->inv_controller, inv->inv_controller);
}
}
endinvent();
/*
* Central Data makes serial and parallel "servers" that can be
* connected in a number of ways. Look for ports...
*/
for (i = 0; i < 10; i ++)
for (j = 0; j < 8; j ++)
for (n = 0; n < 32; n ++)
{
if (i == 8) /* EtherLite */
sprintf(device, "/dev/lpn%d%c", j, funky_hex[n]);
else if (i == 9) /* PCI */
sprintf(device, "/dev/lpp%d%c", j, funky_hex[n]);
else /* SCSI */
sprintf(device, "/dev/lp%d%d%c", i, j, funky_hex[n]);
if (access(device, 0) == 0)
{
if (i == 8)
printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n",
device, j, n);
else if (i == 9)
printf("direct parallel:%s \"Unknown\" \"Central Data PCI Parallel Port, ID %d, port %d\"\n",
device, j, n);
else
printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n",
device, i, j, n);
}
}
#elif defined(__sun)
int i, j, n; /* Looping vars */
char device[255]; /* Device filename */
/*
* Standard parallel ports...
*/
for (i = 0; i < 10; i ++)
{
sprintf(device, "/dev/ecpp%d", i);
if (access(device, 0) == 0)
printf("direct parallel:%s \"Unknown\" \"Sun IEEE-1284 Parallel Port #%d\"\n",
device, i + 1);
}
for (i = 0; i < 10; i ++)
{
sprintf(device, "/dev/bpp%d", i);
if (access(device, 0) == 0)
printf("direct parallel:%s \"Unknown\" \"Sun Standard Parallel Port #%d\"\n",
device, i + 1);
}
for (i = 0; i < 3; i ++)
{
sprintf(device, "/dev/lp%d", i);
if (access(device, 0) == 0)
printf("direct parallel:%s \"Unknown\" \"PC Parallel Port #%d\"\n",
device, i + 1);
}
/*
* MAGMA parallel ports...
*/
for (i = 0; i < 40; i ++)
{
sprintf(device, "/dev/pm%02d", i);
if (access(device, 0) == 0)
printf("direct parallel:%s \"Unknown\" \"MAGMA Parallel Board #%d Port #%d\"\n",
device, (i / 10) + 1, (i % 10) + 1);
}
/*
* Central Data parallel ports...
*/
for (i = 0; i < 9; i ++)
for (j = 0; j < 8; j ++)
for (n = 0; n < 32; n ++)
{
if (i == 8) /* EtherLite */
sprintf(device, "/dev/sts/lpN%d%c", j, funky_hex[n]);
else
sprintf(device, "/dev/sts/lp%c%d%c", i + 'C', j,
funky_hex[n]);
if (access(device, 0) == 0)
{
if (i == 8)
printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n",
device, j, n);
else
printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n",
device, i, j, n);
}
}
#elif defined(__hpux)
int i, j, n; /* Looping vars */
char device[255]; /* Device filename */
/*
* Standard parallel ports...
*/
if (access("/dev/rlp", 0) == 0)
puts("direct parallel:/dev/rlp \"Unknown\" \"Standard Parallel Port (/dev/rlp)\"");
for (i = 0; i < 7; i ++)
for (j = 0; j < 7; j ++)
{
sprintf(device, "/dev/c%dt%dd0_lp", i, j);
if (access(device, 0) == 0)
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d,%d\"\n",
device, i, j);
}
/*
* Central Data parallel ports...
*/
for (i = 0; i < 9; i ++)
for (j = 0; j < 8; j ++)
for (n = 0; n < 32; n ++)
{
if (i == 8) /* EtherLite */
sprintf(device, "/dev/lpN%d%c", j, funky_hex[n]);
else
sprintf(device, "/dev/lp%c%d%c", i + 'C', j,
funky_hex[n]);
if (access(device, 0) == 0)
{
if (i == 8)
printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n",
device, j, n);
else
printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n",
device, i, j, n);
}
}
#elif defined(__osf__)
int i; /* Looping var */
int fd; /* File descriptor */
char device[255]; /* Device filename */
for (i = 0; i < 3; i ++)
{
sprintf(device, "/dev/lp%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
}
}
#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
int i; /* Looping var */
int fd; /* File descriptor */
char device[255]; /* Device filename */
for (i = 0; i < 3; i ++)
{
sprintf(device, "/dev/lpt%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d (interrupt-driven)\"\n", device, i + 1);
}
sprintf(device, "/dev/lpa%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d (polled)\"\n", device, i + 1);
}
}
#elif defined(_AIX)
int i; /* Looping var */
int fd; /* File descriptor */
char device[255]; /* Device filename */
for (i = 0; i < 8; i ++)
{
sprintf(device, "/dev/lp%d", i);
if ((fd = open(device, O_WRONLY)) >= 0)
{
close(fd);
printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1);
}
}
#endif
}
/*
* End of "$Id$".
*/
+210
Ver Arquivo
@@ -0,0 +1,210 @@
/*
* "$Id$"
*
* IRIX SCSI printer support for the Common UNIX Printing System (CUPS).
*
* Copyright 2003 by Easy Software Products, all rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use
* of this software must display the following
* acknowledgement:
*
* This product includes software developed by Easy
* Software Products.
*
* 4. The name of Easy Software Products may not be used to
* endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* Contents:
*
* list_devices() - List the available SCSI printer devices.
* print_device() - Print a file to a SCSI device.
*/
/*
* Include necessary headers.
*/
#include <bstring.h> /* memcpy() and friends */
#include <sys/dsreq.h> /* SCSI interface stuff */
/*
* 'list_devices()' - List the available SCSI printer devices.
*/
void
list_devices(void)
{
puts("direct scsi \"Unknown\" \"SCSI Printer\"");
}
/*
* 'print_device()' - Print a file to a SCSI device.
*/
int /* O - Print status */
print_device(const char *resource, /* I - SCSI device */
int fd, /* I - File to print */
int copies) /* I - Number of copies to print */
{
int scsi_fd; /* SCSI file descriptor */
char buffer[8192]; /* Data buffer */
int bytes; /* Number of bytes */
int try; /* Current try */
dsreq_t scsi_req; /* SCSI request */
char scsi_cmd[6]; /* SCSI command data */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
/*
* Make sure we have a valid resource name...
*/
if (strncmp(resource, "/dev/scsi/", 10) != 0)
{
fprintf(stderr, "ERROR: Bad SCSI device file \"%s\"!\n", resource);
return (1);
}
/*
* Open the SCSI device file...
*/
do
{
if ((scsi_fd = open(resource, O_RDWR | O_EXCL)) == -1)
{
if (errno != EAGAIN && errno != EBUSY)
{
fprintf(stderr, "ERROR: Unable to open SCSI device \"%s\" - %s\n",
resource, strerror(errno));
return (1);
}
else
{
fprintf(stderr, "INFO: SCSI device \"%s\" busy; retrying...\n",
resource);
sleep(30);
}
}
}
while (scsi_fd == -1);
/*
* Now that we are "connected" to the port, ignore SIGTERM so that we
* can finish out any page data the driver sends (e.g. to eject the
* current page... Only ignore SIGTERM if we are printing data from
* stdin (otherwise you can't cancel raw jobs...)
*/
if (fd != 0)
{
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
#else
signal(SIGTERM, SIG_IGN);
#endif /* HAVE_SIGSET */
}
/*
* Copy the print file to the device...
*/
while (copies > 0)
{
if (fd != 0)
lseek(fd, 0, SEEK_SET);
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
{
memset(&scsi_req, 0, sizeof(scsi_req));
scsi_req.ds_flags = DSRQ_WRITE;
scsi_req.ds_time = 60 * 1000;
scsi_req.ds_cmdbuf = scsi_cmd;
scsi_req.ds_cmdlen = 6;
scsi_req.ds_databuf = buffer;
scsi_req.ds_datalen = bytes;
scsi_cmd[0] = 0x0a; /* Group 0 print command */
scsi_cmd[1] = 0x00;
scsi_cmd[2] = bytes / 65536;
scsi_cmd[3] = bytes / 256;
scsi_cmd[4] = bytes;
scsi_cmd[5] = 0x00;
for (try = 0; try < 10; try ++)
if (ioctl(scsi_fd, DS_ENTER, &scsi_req) < 0 ||
scsi_req.ds_status != 0)
{
fprintf(stderr, "WARNING: SCSI command timed out (%d); retrying...\n",
scsi_req.ds_status);
sleep(try + 1);
}
else
break;
if (try >= 10)
{
fprintf(stderr, "ERROR: Unable to send print data (%d)\n",
scsi_req.ds_status);
close(scsi_fd);
return (1);
}
}
copies --;
}
/*
* Close the device and return...
*/
close(fd);
return (0);
}
/*
* End of "$Id$".
*/
+228
Ver Arquivo
@@ -0,0 +1,228 @@
/*
* "$Id$"
*
* Linux SCSI printer support for the Common UNIX Printing System (CUPS).
*
* Copyright 2003 by Easy Software Products, all rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use
* of this software must display the following
* acknowledgement:
*
* This product includes software developed by Easy
* Software Products.
*
* 4. The name of Easy Software Products may not be used to
* endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* Contents:
*
* list_devices() - List the available SCSI printer devices.
* print_device() - Print a file to a SCSI device.
*/
/*
* Include necessary headers.
*/
#include <scsi/sg.h>
/*
* We currently only support the Linux 2.4 generic SCSI interface.
*/
#ifndef SG_DXFER_TO_DEV
/*
* Dummy functions that do nothing on unsupported platforms...
*/
void list_devices(void) {}
int print_device(const char *resource, int fd, int copies) { return (1); }
#else
/*
* 'list_devices()' - List the available SCSI printer devices.
*/
void
list_devices(void)
{
puts("direct scsi \"Unknown\" \"SCSI Printer\"");
}
/*
* 'print_device()' - Print a file to a SCSI device.
*/
int /* O - Print status */
print_device(const char *resource, /* I - SCSI device */
int fd, /* I - File to print */
int copies) /* I - Number of copies to print */
{
int scsi_fd; /* SCSI file descriptor */
char buffer[8192]; /* Data buffer */
int bytes; /* Number of bytes */
int try; /* Current try */
sg_io_hdr_t scsi_req; /* SCSI request */
char scsi_cmd[6], /* SCSI command data */
scsi_sense[32]; /* SCSI sense data */
# if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
# endif /* HAVE_SIGACTION && !HAVE_SIGSET */
/*
* Make sure we have a valid resource name...
*/
if (strncmp(resource, "/dev/sg", 7) != 0)
{
fprintf(stderr, "ERROR: Bad SCSI device file \"%s\"!\n", resource);
return (1);
}
/*
* Open the SCSI device file...
*/
do
{
if ((scsi_fd = open(resource, O_RDWR | O_EXCL)) == -1)
{
if (errno != EAGAIN && errno != EBUSY)
{
fprintf(stderr, "ERROR: Unable to open SCSI device \"%s\" - %s\n",
resource, strerror(errno));
return (1);
}
else
{
fprintf(stderr, "INFO: SCSI device \"%s\" busy; retrying...\n",
resource);
sleep(30);
}
}
}
while (scsi_fd == -1);
/*
* Now that we are "connected" to the port, ignore SIGTERM so that we
* can finish out any page data the driver sends (e.g. to eject the
* current page... Only ignore SIGTERM if we are printing data from
* stdin (otherwise you can't cancel raw jobs...)
*/
if (fd != 0)
{
# ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
# elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
# else
signal(SIGTERM, SIG_IGN);
# endif /* HAVE_SIGSET */
}
/*
* Copy the print file to the device...
*/
while (copies > 0)
{
if (fd != 0)
lseek(fd, 0, SEEK_SET);
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
{
memset(&scsi_req, 0, sizeof(scsi_req));
scsi_req.interface_id = 'S';
scsi_req.dxfer_direction = SG_DXFER_TO_DEV;
scsi_req.cmd_len = 6;
scsi_req.mx_sb_len = sizeof(scsi_sense);
scsi_req.iovec_count = 0;
scsi_req.dxfer_len = bytes;
scsi_req.dxferp = buffer;
scsi_req.cmdp = scsi_cmd;
scsi_req.sbp = scsi_sense;
scsi_req.timeout = 60 * 1000;
scsi_cmd[0] = 0x0a; /* Group 0 print command */
scsi_cmd[1] = 0x00;
scsi_cmd[2] = bytes / 65536;
scsi_cmd[3] = bytes / 256;
scsi_cmd[4] = bytes;
scsi_cmd[5] = 0x00;
for (try = 0; try < 10; try ++)
if (ioctl(scsi_fd, SG_IO, &scsi_req) < 0 ||
scsi_req.status != 0)
{
fprintf(stderr, "WARNING: SCSI command timed out (%d); retrying...\n",
scsi_req.status);
sleep(try + 1);
}
else
break;
if (try >= 10)
{
fprintf(stderr, "ERROR: Unable to send print data (%d)\n",
scsi_req.status);
close(scsi_fd);
return (1);
}
}
copies --;
}
/*
* Close the device and return...
*/
close(fd);
return (0);
}
#endif /* !SG_DXFER_TO_DEV */
/*
* End of "$Id$".
*/
+223
Ver Arquivo
@@ -0,0 +1,223 @@
/*
* "$Id$"
*
* SCSI printer backend for the Common UNIX Printing System (CUPS).
*
* Copyright 2003 by Easy Software Products, all rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use
* of this software must display the following
* acknowledgement:
*
* This product includes software developed by Easy
* Software Products.
*
* 4. The name of Easy Software Products may not be used to
* endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* Contents:
*
* main() - Send a file to the specified SCSI printer.
*/
/*
* Include necessary headers.
*/
#include <cups/cups.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cups/string.h>
#include <signal.h>
#ifdef WIN32
# include <io.h>
#else
# include <unistd.h>
# include <fcntl.h>
# ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
# endif /* HAVE_SYS_IOCTL_H */
#endif /* WIN32 */
/*
* Local functions...
*/
void list_devices(void);
int print_device(const char *resource, int fd, int copies);
#ifdef __linux__
# include "scsi-linux.c"
#elif defined(__sgi)
# include "scsi-irix.c"
#else
/*
* Dummy functions that do nothing on unsupported platforms...
*/
void list_devices(void) {}
int print_device(const char *resource, int fd, int copies) { return (1); }
#endif /* __linux */
/*
* 'main()' - Send a file to the specified SCSI printer.
*
* Usage:
*
* printer-uri job-id user title copies options [file]
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments (6 or 7) */
char *argv[]) /* I - Command-line arguments */
{
char method[255], /* Method in URI */
hostname[1024], /* Hostname */
username[255], /* Username info (not used) */
resource[1024], /* Resource info (device and options) */
*options; /* Pointer to options */
int port; /* Port number (not used) */
int fp; /* Print file */
int copies; /* Number of copies to print */
int status; /* Exit status */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
/*
* Make sure status messages are not buffered...
*/
setbuf(stderr, NULL);
/*
* Ignore SIGPIPE signals...
*/
#ifdef HAVE_SIGSET
sigset(SIGPIPE, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &action, NULL);
#else
signal(SIGPIPE, SIG_IGN);
#endif /* HAVE_SIGSET */
/*
* Check command-line...
*/
if (argc == 1)
{
list_devices();
return (0);
}
else if (argc < 6 || argc > 7)
{
fputs("Usage: scsi:/dev/file job-id user title copies options [file]\n", stderr);
return (1);
}
/*
* If we have 7 arguments, print the file named on the command-line.
* Otherwise, send stdin instead...
*/
if (argc == 6)
{
fp = 0;
copies = 1;
}
else
{
/*
* Try to open the print file...
*/
if ((fp = open(argv[6], O_RDONLY)) < 0)
{
perror("ERROR: unable to open print file");
return (1);
}
copies = atoi(argv[4]);
}
/*
* Extract the device name and options from the URI...
*/
httpSeparate(argv[0], method, username, hostname, &port, resource);
/*
* See if there are any options...
*/
if ((options = strchr(resource, '?')) != NULL)
{
/*
* Yup, terminate the device name string and move to the first
* character of the options...
*/
*options++ = '\0';
}
/*
* Finally, send the print file...
*/
status = print_device(resource, fp, copies);
/*
* Close input file and return...
*/
if (fp != 0)
close(fp);
if (!status)
fputs("INFO: Ready to print.\n", stderr);
return (status);
}
/*
* End of "$Id$".
*/
+729 -32
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Serial port backend for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -14,16 +14,19 @@
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44145 Airport View Drive, Suite 204
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* main() - Send a file to the printer or server.
* main() - Send a file to the printer or server.
* list_devices() - List all serial devices.
*/
/*
@@ -33,15 +36,57 @@
#include <cups/cups.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cups/string.h>
#include <signal.h>
#if defined(WIN32) || defined(__EMX__)
#ifdef __hpux
# include <sys/modem.h>
#endif /* __hpux */
#ifdef WIN32
# include <io.h>
#else
# include <unistd.h>
# include <fcntl.h>
# include <termios.h>
#endif /* WIN32 || __EMX__ */
# ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
# endif /* HAVE_SYS_IOCTL_H */
#endif /* WIN32 */
#ifdef __sgi
# include <invent.h>
# ifndef INV_EPP_ECP_PLP
# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */
# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */
# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */
# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */
# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */
# endif /* !INV_EPP_ECP_PLP */
#endif /* __sgi */
#ifndef CRTSCTS
# ifdef CNEW_RTSCTS
# define CRTSCTS CNEW_RTSCTS
# else
# define CRTSCTS 0
# endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */
#if defined(__APPLE__)
# include <CoreFoundation/CoreFoundation.h>
# include <IOKit/IOKitLib.h>
# include <IOKit/serial/IOSerialKeys.h>
# include <IOKit/IOBSD.h>
#endif /* __APPLE__ */
/*
* Local functions...
*/
void list_devices(void);
/*
@@ -65,16 +110,53 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
value[255], /* Value of option */
*ptr; /* Pointer into name or value */
int port; /* Port number (not used) */
FILE *fp; /* Print file */
int fp; /* Print file */
int copies; /* Number of copies to print */
int fd; /* Parallel device */
int error; /* Error code (if any) */
size_t nbytes, /* Number of bytes written */
int wbytes; /* Number of bytes written */
size_t nbytes, /* Number of bytes read */
tbytes; /* Total number of bytes written */
char buffer[8192]; /* Output buffer */
struct termios opts; /* Parallel port options */
int dtrdsr; /* Do dtr/dsr flow control? */
int bufsize; /* Size of output buffer for writes */
char buffer[8192], /* Output buffer */
*bufptr; /* Pointer into buffer */
struct termios opts; /* Serial port options */
struct termios origopts; /* Original port options */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
if (argc < 6 || argc > 7)
/*
* Make sure status messages are not buffered...
*/
setbuf(stderr, NULL);
/*
* Ignore SIGPIPE signals...
*/
#ifdef HAVE_SIGSET
sigset(SIGPIPE, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &action, NULL);
#else
signal(SIGPIPE, SIG_IGN);
#endif /* HAVE_SIGSET */
/*
* Check command-line...
*/
if (argc == 1)
{
list_devices();
return (0);
}
else if (argc < 6 || argc > 7)
{
fputs("Usage: serial job-id user title copies options [file]\n", stderr);
return (1);
@@ -86,18 +168,23 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
if (argc == 6)
fp = stdin;
{
fp = 0;
copies = 1;
}
else
{
/*
* Try to open the print file...
*/
if ((fp = fopen(argv[6], "rb")) == NULL)
if ((fp = open(argv[6], O_RDONLY)) < 0)
{
perror("ERROR: unable to open print file");
return (1);
}
copies = atoi(argv[4]);
}
/*
@@ -121,22 +208,40 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
/*
* Open the parallel port device...
* Open the serial port device...
*/
if ((fd = open(resource, O_WRONLY)) == -1)
do
{
perror("ERROR: Unable to open serial port device file");
return (1);
if ((fd = open(resource, O_WRONLY | O_NOCTTY | O_EXCL | O_NDELAY)) == -1)
{
if (errno == EBUSY)
{
fputs("INFO: Serial port busy; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else
{
fprintf(stderr, "ERROR: Unable to open serial port device file \"%s\": %s\n",
resource, strerror(errno));
return (1);
}
}
}
while (fd < 0);
/*
* Set any options provided...
*/
tcgetattr(fd, &origopts);
tcgetattr(fd, &opts);
opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */
opts.c_oflag &= ~OPOST; /* Don't post-process */
bufsize = 96; /* 9600 baud / 10 bits/char / 10Hz */
dtrdsr = 0; /* No dtr/dsr flow control */
if (options != NULL)
while (*options)
@@ -177,6 +282,8 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Set the baud rate...
*/
bufsize = atoi(value) / 100;
#if B19200 == 19200
cfsetispeed(&opts, atoi(value));
cfsetospeed(&opts, atoi(value));
@@ -207,6 +314,24 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
cfsetispeed(&opts, B38400);
cfsetospeed(&opts, B38400);
break;
# ifdef B57600
case 57600 :
cfsetispeed(&opts, B57600);
cfsetospeed(&opts, B57600);
break;
# endif /* B57600 */
# ifdef B115200
case 115200 :
cfsetispeed(&opts, B115200);
cfsetospeed(&opts, B115200);
break;
# endif /* B115200 */
# ifdef B230400
case 230400 :
cfsetispeed(&opts, B230400);
cfsetospeed(&opts, B230400);
break;
# endif /* B230400 */
default :
fprintf(stderr, "WARNING: Unsupported baud rate %s!\n", value);
break;
@@ -253,45 +378,617 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
else if (strcasecmp(value, "none") == 0)
opts.c_cflag &= ~PARENB;
}
else if (strcasecmp(name, "flow") == 0)
{
/*
* Set flow control...
*/
if (strcasecmp(value, "none") == 0)
{
opts.c_iflag &= ~(IXON | IXOFF);
opts.c_cflag &= ~CRTSCTS;
}
else if (strcasecmp(value, "soft") == 0)
{
opts.c_iflag |= IXON | IXOFF;
opts.c_cflag &= ~CRTSCTS;
}
else if (strcasecmp(value, "hard") == 0 ||
strcasecmp(value, "rtscts") == 0)
{
opts.c_iflag &= ~(IXON | IXOFF);
opts.c_cflag |= CRTSCTS;
}
else if (strcasecmp(value, "dtrdsr") == 0)
{
opts.c_iflag &= ~(IXON | IXOFF);
opts.c_cflag &= ~CRTSCTS;
dtrdsr = 1;
}
}
}
tcsetattr(fd, TCSANOW, &opts);
fcntl(fd, F_SETFL, 0);
/*
* Now that we are "connected" to the port, ignore SIGTERM so that we
* can finish out any page data the driver sends (e.g. to eject the
* current page... Only ignore SIGTERM if we are printing data from
* stdin (otherwise you can't cancel raw jobs...)
*/
if (argc < 7)
{
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
#else
signal(SIGTERM, SIG_IGN);
#endif /* HAVE_SIGSET */
}
/*
* Finally, send the print file...
*/
tbytes = 0;
while ((nbytes = fread(buffer, 1, sizeof(buffer), fp)) > 0)
if (bufsize > sizeof(buffer))
bufsize = sizeof(buffer);
while (copies > 0)
{
/*
* Write the print data to the printer...
*/
copies --;
if (write(fd, buffer, nbytes) < nbytes)
if (fp != 0)
{
perror("ERROR: Unable to send print file to printer");
break;
fputs("PAGE: 1 1\n", stderr);
lseek(fp, 0, SEEK_SET);
}
else
tbytes += nbytes;
if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
if (dtrdsr)
{
/*
* Check the port and sleep until DSR is set...
*/
int status;
if (!ioctl(fd, TIOCMGET, &status))
if (!(status & TIOCM_DSR))
{
/*
* Wait for DSR to go high...
*/
fputs("DEBUG: DSR is low; waiting for device...\n", stderr);
do
{
sleep(1);
if (ioctl(fd, TIOCMGET, &status))
break;
}
while (!(status & TIOCM_DSR));
fputs("DEBUG: DSR is high; writing to device...\n", stderr);
}
}
tbytes = 0;
while ((nbytes = read(fp, buffer, bufsize)) > 0)
{
/*
* Write the print data to the printer...
*/
tbytes += nbytes;
bufptr = buffer;
while (nbytes > 0)
{
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
if (errno == ENOTTY)
wbytes = write(fd, bufptr, nbytes);
if (wbytes < 0)
{
perror("ERROR: Unable to send print file to printer");
break;
}
nbytes -= wbytes;
bufptr += wbytes;
}
if (wbytes < 0)
break;
if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
(unsigned long)tbytes);
}
}
/*
* Close the socket connection and input file and return...
* Close the serial port and input file and return...
*/
tcsetattr(fd, TCSADRAIN, &origopts);
close(fd);
if (fp != stdin)
fclose(fp);
if (fp != 0)
close(fp);
fputs("INFO: Ready to print.\n", stderr);
return (0);
}
/*
* 'list_devices()' - List all serial devices.
*/
void
list_devices(void)
{
#if defined(__hpux) || defined(__sgi) || defined(__sun) || defined(__FreeBSD__) || defined(__OpenBSD__)
static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz";
/* Funky hex numbering used for some devices */
#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ */
#if defined(__linux) || defined(linux) || defined(__linux__)
int i; /* Looping var */
int fd; /* File descriptor */
char device[255]; /* Device filename */
for (i = 0; i < 100; i ++)
{
sprintf(device, "/dev/ttyS%d", i);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
# if defined(_ARCH_PPC) || defined(powerpc) || defined(__powerpc)
printf("serial serial:%s?baud=230400 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
# else
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
# endif /* _ARCH_PPC || powerpc || __powerpc */
}
}
for (i = 0; i < 16; i ++)
{
sprintf(device, "/dev/usb/ttyUSB%d", i);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=230400 \"Unknown\" \"USB Serial Port #%d\"\n",
device, i + 1);
}
}
#elif defined(__sgi)
int i, j, n; /* Looping vars */
char device[255]; /* Device filename */
inventory_t *inv; /* Hardware inventory info */
/*
* IRIX maintains a hardware inventory of most devices...
*/
setinvent();
while ((inv = getinvent()) != NULL)
{
if (inv->inv_class == INV_SERIAL)
{
/*
* Some sort of serial port...
*/
if (inv->inv_type == INV_CDSIO || inv->inv_type == INV_CDSIO_E)
{
/*
* CDSIO port...
*/
for (n = 0; n < 6; n ++)
printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"CDSIO Board %d Serial Port #%d\"\n",
n + 5 + 8 * inv->inv_controller, inv->inv_controller, n + 1);
}
else if (inv->inv_type == INV_EPC_SERIAL)
{
/*
* Everest serial port...
*/
if (inv->inv_unit == 0)
i = 1;
else
i = 41 + 4 * (int)inv->inv_controller;
for (n = 0; n < (int)inv->inv_state; n ++)
printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"EPC Serial Port %d, Ebus slot %d\"\n",
n + i, n + 1, (int)inv->inv_controller);
}
else if (inv->inv_state > 1)
{
/*
* Standard serial port under IRIX 6.4 and earlier...
*/
for (n = 0; n < (int)inv->inv_state; n ++)
printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"Onboard Serial Port %d\"\n",
n + (int)inv->inv_unit + 1, n + (int)inv->inv_unit + 1);
}
else
{
/*
* Standard serial port under IRIX 6.5 and beyond...
*/
printf("serial serial:/dev/ttyd%d?baud=115200 \"Unknown\" \"Onboard Serial Port %d\"\n",
(int)inv->inv_controller, (int)inv->inv_controller);
}
}
}
endinvent();
/*
* Central Data makes serial and parallel "servers" that can be
* connected in a number of ways. Look for ports...
*/
for (i = 0; i < 10; i ++)
for (j = 0; j < 8; j ++)
for (n = 0; n < 32; n ++)
{
if (i == 8) /* EtherLite */
sprintf(device, "/dev/ttydn%d%c", j, funky_hex[n]);
else if (i == 9) /* PCI */
sprintf(device, "/dev/ttydp%d%c", j, funky_hex[n]);
else /* SCSI */
sprintf(device, "/dev/ttyd%d%d%c", i, j, funky_hex[n]);
if (access(device, 0) == 0)
{
if (i == 8)
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n",
device, j, n);
else if (i == 9)
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data PCI Serial Port, ID %d, port %d\"\n",
device, j, n);
else
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n",
device, i, j, n);
}
}
#elif defined(__sun)
int i, j, n; /* Looping vars */
char device[255]; /* Device filename */
/*
* Standard serial ports...
*/
for (i = 0; i < 26; i ++)
{
sprintf(device, "/dev/cua/%c", 'a' + i);
if (access(device, 0) == 0)
#ifdef B115200
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
#else
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
#endif /* B115200 */
}
/*
* MAGMA serial ports...
*/
for (i = 0; i < 40; i ++)
{
sprintf(device, "/dev/term/%02d", i);
if (access(device, 0) == 0)
printf("serial serial:%s?baud=38400 \"Unknown\" \"MAGMA Serial Board #%d Port #%d\"\n",
device, (i / 10) + 1, (i % 10) + 1);
}
/*
* Central Data serial ports...
*/
for (i = 0; i < 9; i ++)
for (j = 0; j < 8; j ++)
for (n = 0; n < 32; n ++)
{
if (i == 8) /* EtherLite */
sprintf(device, "/dev/sts/ttyN%d%c", j, funky_hex[n]);
else
sprintf(device, "/dev/sts/tty%c%d%c", i + 'C', j,
funky_hex[n]);
if (access(device, 0) == 0)
{
if (i == 8)
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n",
device, j, n);
else
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n",
device, i, j, n);
}
}
#elif defined(__hpux)
int i, j, n; /* Looping vars */
char device[255]; /* Device filename */
/*
* Standard serial ports...
*/
for (i = 0; i < 10; i ++)
{
sprintf(device, "/dev/tty%dp0", i);
if (access(device, 0) == 0)
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
}
/*
* Central Data serial ports...
*/
for (i = 0; i < 9; i ++)
for (j = 0; j < 8; j ++)
for (n = 0; n < 32; n ++)
{
if (i == 8) /* EtherLite */
sprintf(device, "/dev/ttyN%d%c", j, funky_hex[n]);
else
sprintf(device, "/dev/tty%c%d%c", i + 'C', j,
funky_hex[n]);
if (access(device, 0) == 0)
{
if (i == 8)
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n",
device, j, n);
else
printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n",
device, i, j, n);
}
}
#elif defined(__osf__)
int i; /* Looping var */
char device[255]; /* Device filename */
/*
* Standard serial ports...
*/
for (i = 0; i < 100; i ++)
{
sprintf(device, "/dev/tty%02d", i);
if (access(device, 0) == 0)
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
}
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
int i, j; /* Looping vars */
int fd; /* File descriptor */
char device[255]; /* Device filename */
/*
* SIO ports...
*/
for (i = 0; i < 32; i ++)
{
sprintf(device, "/dev/ttyd%c", funky_hex[i]);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"Standard Serial Port #%d\"\n",
device, i + 1);
}
}
/*
* Cyclades ports...
*/
for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */
for (j = 0; j < 32; j ++)
{
sprintf(device, "/dev/ttyc%d%c", i, funky_hex[j]);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Port #%d\"\n",
device, i, j + 1);
}
}
/*
* Digiboard ports...
*/
for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */
for (j = 0; j < 32; j ++)
{
sprintf(device, "/dev/ttyD%d%c", i, funky_hex[j]);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"Digiboard #%d Serial Port #%d\"\n",
device, i, j + 1);
}
}
/*
* Stallion ports...
*/
for (i = 0; i < 32; i ++)
{
sprintf(device, "/dev/ttyE%c", funky_hex[i]);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"Stallion Serial Port #%d\"\n",
device, i + 1);
}
}
/*
* SX ports...
*/
for (i = 0; i < 128; i ++)
{
sprintf(device, "/dev/ttyA%d", i + 1);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"SX Serial Port #%d\"\n",
device, i + 1);
}
}
#elif defined(__NetBSD__)
int i, j; /* Looping vars */
int fd; /* File descriptor */
char device[255]; /* Device filename */
/*
* Standard serial ports...
*/
for (i = 0; i < 4; i ++)
{
sprintf(device, "/dev/tty%02d", i);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
}
}
/*
* Cyclades-Z ports...
*/
for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */
for (j = 0; j < 64; j ++)
{
sprintf(device, "/dev/ttyCZ%02d%02d", i, j);
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
close(fd);
printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Prt #%d\"\n",
device, i, j + 1);
}
}
#elif defined(__APPLE__)
/*
* Standard serial ports on MacOS X...
*/
kern_return_t kernResult;
mach_port_t masterPort;
io_iterator_t serialPortIterator;
CFMutableDictionaryRef classesToMatch;
io_object_t serialService;
printf("serial serial \"Unknown\" \"Serial Printer (serial)\"\n");
kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
if (KERN_SUCCESS != kernResult)
return;
/*
* Serial devices are instances of class IOSerialBSDClient.
*/
classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
if (classesToMatch != NULL)
{
CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey),
CFSTR(kIOSerialBSDRS232Type));
kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch,
&serialPortIterator);
if (kernResult == KERN_SUCCESS)
{
while ((serialService = IOIteratorNext(serialPortIterator)))
{
CFTypeRef serialNameAsCFString;
CFTypeRef bsdPathAsCFString;
char serialName[128];
char bsdPath[1024];
Boolean result;
serialNameAsCFString =
IORegistryEntryCreateCFProperty(serialService,
CFSTR(kIOTTYDeviceKey),
kCFAllocatorDefault, 0);
if (serialNameAsCFString)
{
result = CFStringGetCString(serialNameAsCFString, serialName,
sizeof(serialName),
kCFStringEncodingASCII);
CFRelease(serialNameAsCFString);
if (result)
{
bsdPathAsCFString =
IORegistryEntryCreateCFProperty(serialService,
CFSTR(kIOCalloutDeviceKey),
kCFAllocatorDefault, 0);
if (bsdPathAsCFString)
{
result = CFStringGetCString(bsdPathAsCFString, bsdPath,
sizeof(bsdPath),
kCFStringEncodingASCII);
CFRelease(bsdPathAsCFString);
if (result)
printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", bsdPath,
serialName);
}
}
}
IOObjectRelease(serialService);
}
IOObjectRelease(serialPortIterator); /* Release the iterator. */
}
}
#endif
}
/*
* End of "$Id$".
*/
-66
Ver Arquivo
@@ -1,66 +0,0 @@
/*
* "$Id$"
*
* Server Message Block 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
* 44145 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
*/
/*
* Include necessary headers.
*/
#include <cups/cups.h>
#include <stdio.h>
#include <stdlib.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 */
{
if (argc < 6 || argc > 7)
{
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
argv[0]);
return (1);
}
fputs("ERROR: Backend not implemented yet!\n", stderr);
return (1);
}
/*
* End of "$Id$".
*/
+267 -81
Ver Arquivo
@@ -3,7 +3,7 @@
*
* AppSocket backend for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -21,6 +21,8 @@
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* main() - Send a file to the printer or server.
@@ -34,19 +36,30 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <cups/http-private.h>
#include <cups/string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#if defined(WIN32) || defined(__EMX__)
#ifdef WIN32
# include <winsock.h>
#else
# include <unistd.h>
# include <fcntl.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <arpa/inet.h>
# include <netdb.h>
#endif /* WIN32 || __EMX__ */
#endif /* WIN32 */
/*
* Local functions...
*/
void print_backchannel(const unsigned char *buffer, int nbytes);
/*
@@ -57,30 +70,64 @@
* printer-uri job-id user title copies options [file]
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments (6 or 7) */
char *argv[]) /* I - Command-line arguments */
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments (6 or 7) */
char *argv[]) /* I - Command-line arguments */
{
char method[255], /* Method in URI */
hostname[1024], /* Hostname */
username[255], /* Username info (not used) */
resource[1024]; /* Resource info (not used) */
FILE *fp; /* Print file */
int fp; /* Print file */
int copies; /* Number of copies to print */
int port; /* Port number */
int delay; /* Delay for retries... */
int fd; /* AppSocket */
int error; /* Error code (if any) */
struct sockaddr_in addr; /* Socket address */
struct hostent *hostaddr; /* Host address */
int wbytes; /* Number of bytes written */
size_t nbytes, /* Number of bytes read */
tbytes; /* Total number of bytes written */
int nbytes; /* Number of bytes read */
size_t tbytes; /* Total number of bytes written */
char buffer[8192], /* Output buffer */
*bufptr; /* Pointer into buffer */
struct timeval timeout; /* Timeout for select() */
fd_set input; /* Input set for select() */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
if (argc < 6 || argc > 7)
/*
* Make sure status messages are not buffered...
*/
setbuf(stderr, NULL);
/*
* Ignore SIGPIPE signals...
*/
#ifdef HAVE_SIGSET
sigset(SIGPIPE, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &action, NULL);
#else
signal(SIGPIPE, SIG_IGN);
#endif /* HAVE_SIGSET */
/*
* Check command-line...
*/
if (argc == 1)
{
puts("network socket \"Unknown\" \"AppSocket/HP JetDirect\"");
return (0);
}
else if (argc < 6 || argc > 7)
{
fprintf(stderr, "Usage: %s job-id user title copies options [file]\n",
argv[0]);
@@ -93,18 +140,23 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
if (argc == 6)
fp = stdin;
{
fp = 0;
copies = 1;
}
else
{
/*
* Try to open the print file...
*/
if ((fp = fopen(argv[6], "rb")) == NULL)
if ((fp = open(argv[6], O_RDONLY)) < 0)
{
perror("ERROR: unable to open print file");
return (1);
}
copies = atoi(argv[4]);
}
/*
@@ -120,10 +172,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
* Then try to connect to the remote host...
*/
if ((hostaddr = gethostbyname(hostname)) == NULL)
if ((hostaddr = httpGetHostByName(hostname)) == NULL)
{
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s",
hostname, strerror(errno));
fprintf(stderr, "ERROR: Unable to locate printer \'%s\' - %s\n",
hostname, hstrerror(h_errno));
return (1);
}
@@ -135,98 +187,232 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
addr.sin_family = hostaddr->h_addrtype;
addr.sin_port = htons(port);
for (;;)
while (copies > 0)
{
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
for (delay = 5;;)
{
perror("ERROR: Unable to connect to printer");
return (1);
}
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
error = errno;
close(fd);
fd = -1;
if (error == ECONNREFUSED)
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...\n",
hostname);
sleep(30);
perror("ERROR: Unable to create socket");
return (1);
}
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
error = errno;
close(fd);
fd = -1;
if (error == ECONNREFUSED || error == EHOSTDOWN ||
error == EHOSTUNREACH)
{
fprintf(stderr, "INFO: Network host \'%s\' is busy; will retry in %d seconds...\n",
hostname, delay);
sleep(delay);
if (delay < 30)
delay += 5;
}
else
{
perror("ERROR: Unable to connect to printer (retrying in 30 seconds)");
sleep(30);
}
}
else
{
perror("ERROR: Unable to connect to printer");
return (1);
}
}
else
break;
}
/*
* 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...
* Now that we are "connected" to the port, ignore SIGTERM so that we
* can finish out any page data the driver sends (e.g. to eject the
* current page... Only ignore SIGTERM if we are printing data from
* stdin (otherwise you can't cancel raw jobs...)
*/
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&input);
FD_SET(fd, &input);
if (select(fd + 1, &input, NULL, NULL, &timeout) > 0)
if (argc < 7)
{
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
#else
signal(SIGTERM, SIG_IGN);
#endif /* HAVE_SIGSET */
}
/*
* Finally, send the print file...
*/
copies --;
if (fp != 0)
{
fputs("PAGE: 1 1\n", stderr);
lseek(fp, 0, SEEK_SET);
}
fputs("INFO: Connected to host, sending print job...\n", stderr);
tbytes = 0;
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
{
/*
* Grab the data coming back and spit it out to stderr...
* Write the print data to the printer...
*/
if ((nbytes = recv(fd, buffer, sizeof(buffer), 0)) > 0)
fprintf(stderr, "INFO: Received %u bytes of back-channel data!\n",
nbytes);
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;
}
if (wbytes < 0)
break;
/*
* 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 %d bytes of back-channel data!\n",
nbytes);
print_backchannel((unsigned char *)buffer, nbytes);
}
}
else if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
(unsigned long)tbytes);
}
else if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %u bytes...\n", tbytes);
/*
* Shutdown the socket and wait for the other end to finish...
*/
fputs("INFO: Print file sent, waiting for printer to finish...\n", stderr);
shutdown(fd, 1);
for (;;)
{
/*
* Wait a maximum of 90 seconds for backchannel data or a closed
* connection...
*/
timeout.tv_sec = 90;
timeout.tv_usec = 0;
FD_ZERO(&input);
FD_SET(fd, &input);
#ifdef __hpux
if (select(fd + 1, (int *)&input, NULL, NULL, &timeout) > 0)
#else
if (select(fd + 1, &input, NULL, NULL, &timeout) > 0)
#endif /* __hpux */
{
/*
* Grab the data coming back and spit it out to stderr...
*/
if ((nbytes = recv(fd, buffer, sizeof(buffer), 0)) > 0)
{
fprintf(stderr, "INFO: Received %d bytes of back-channel data!\n",
nbytes);
print_backchannel((unsigned char *)buffer, nbytes);
}
else
break;
}
else
break;
}
/*
* Close the socket connection...
*/
close(fd);
}
/*
* Close the socket connection and input file and return...
* Close the input file and return...
*/
close(fd);
if (fp != stdin)
fclose(fp);
if (fp != 0)
close(fp);
fputs("INFO: Ready to print.\n", stderr);
return (0);
}
/*
* 'print_backchannel()' - Print the contents of a back-channel buffer.
*/
void
print_backchannel(const unsigned char *buffer, /* I - Data buffer */
int nbytes) /* I - Number of bytes */
{
char line[255], /* Formatted line */
*lineptr; /* Pointer into line */
for (lineptr = line; nbytes > 0; buffer ++, nbytes --)
{
if (*buffer < 0x20 || *buffer >= 0x7f)
{
snprintf(lineptr, sizeof(line) - (lineptr - line), "<%02X>", *buffer);
lineptr += strlen(lineptr);
}
else
*lineptr++ = *buffer;
if ((lineptr - line) > 72)
{
*lineptr = '\0';
fprintf(stderr, "DEBUG: DATA: %s\n", line);
lineptr = line;
}
}
if (lineptr > line)
{
*lineptr = '\0';
fprintf(stderr, "DEBUG: DATA: %s\n", line);
}
}
/*
* End of "$Id$".
*/
+806
Ver Arquivo
@@ -0,0 +1,806 @@
/*
* "$Id$"
*
* USB port backend for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* main() - Send a file to the specified USB port.
* list_devices() - List all USB devices.
*/
/*
* Include necessary headers.
*/
#include <cups/cups.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cups/string.h>
#include <signal.h>
#ifdef WIN32
# include <io.h>
#else
# include <unistd.h>
# include <fcntl.h>
# include <termios.h>
#endif /* WIN32 */
#ifdef __linux
# include <sys/ioctl.h>
# include <linux/lp.h>
# define IOCNR_GET_DEVICE_ID 1
/*
* Get device_id string
*/
# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
#endif /* __linux */
#ifdef __sun
# ifdef __sparc
# include <sys/ecppio.h>
# else
# include <sys/ecppsys.h>
# endif /* __sparc */
#endif /* __sun */
/*
* Local functions...
*/
void decode_device_id(int port, const char *device_id,
char *make_model, int mmsize,
char *uri, int urisize);
void list_devices(void);
int open_device(const char *uri);
/*
* 'main()' - Send a file to the specified USB port.
*
* Usage:
*
* printer-uri job-id user title copies options [file]
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments (6 or 7) */
char *argv[]) /* I - Command-line arguments */
{
int fp; /* Print file */
int copies; /* Number of copies to print */
int fd; /* Parallel device */
int wbytes; /* Number of bytes written */
size_t nbytes, /* Number of bytes read */
tbytes; /* Total number of bytes written */
char buffer[8192], /* Output buffer */
*bufptr; /* Pointer into buffer */
struct termios opts; /* Parallel port options */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Actions for POSIX signals */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
#ifdef __linux
unsigned char status; /* Port status (off-line, out-of-paper, etc.) */
#endif /* __linux */
/*
* Make sure status messages are not buffered...
*/
setbuf(stderr, NULL);
/*
* Ignore SIGPIPE signals...
*/
#ifdef HAVE_SIGSET
sigset(SIGPIPE, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &action, NULL);
#else
signal(SIGPIPE, SIG_IGN);
#endif /* HAVE_SIGSET */
/*
* Check command-line...
*/
if (argc == 1)
{
list_devices();
return (0);
}
else if (argc < 6 || argc > 7)
{
fputs("Usage: USB job-id user title copies options [file]\n", stderr);
return (1);
}
/*
* If we have 7 arguments, print the file named on the command-line.
* Otherwise, send stdin instead...
*/
if (argc == 6)
{
fp = 0;
copies = 1;
}
else
{
/*
* Try to open the print file...
*/
if ((fp = open(argv[6], O_RDONLY)) < 0)
{
perror("ERROR: unable to open print file");
return (1);
}
copies = atoi(argv[4]);
}
/*
* Open the USB port device...
*/
do
{
if ((fd = open_device(argv[0])) == -1)
{
if (errno == EBUSY)
{
fputs("INFO: USB port busy; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
{
fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else
{
fprintf(stderr, "ERROR: Unable to open USB device \"%s\": %s\n",
argv[0], strerror(errno));
return (1);
}
}
}
while (fd < 0);
/*
* Set any options provided...
*/
tcgetattr(fd, &opts);
opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */
/**** No options supported yet ****/
tcsetattr(fd, TCSANOW, &opts);
/*
* Now that we are "connected" to the port, ignore SIGTERM so that we
* can finish out any page data the driver sends (e.g. to eject the
* current page... Only ignore SIGTERM if we are printing data from
* stdin (otherwise you can't cancel raw jobs...)
*/
if (argc < 7)
{
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
sigset(SIGTERM, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
#else
signal(SIGTERM, SIG_IGN);
#endif /* HAVE_SIGSET */
}
#if defined(__linux) && defined(LP_POUTPA)
/*
* Show the printer status before we send the file; normally, we'd
* do this while we write data to the printer, however at least some
* Linux kernels have buggy USB drivers which don't like to be
* queried while sending data to the printer...
*
* Also, we're using the 8255 constants instead of the ones that are
* supposed to be used, as it appears that the USB driver also doesn't
* follow standards...
*/
if (ioctl(fd, LPGETSTATUS, &status) == 0)
{
fprintf(stderr, "DEBUG: LPGETSTATUS returned a port status of %02X...\n", status);
if (!(status & LP_POUTPA))
fputs("WARNING: Media tray empty!\n", stderr);
else if (!(status & LP_PERRORP))
fputs("WARNING: Printer fault!\n", stderr);
else if (!(status & LP_PSELECD))
fputs("WARNING: Printer off-line.\n", stderr);
}
#endif /* __linux && LP_POUTPA */
/*
* Finally, send the print file...
*/
while (copies > 0)
{
copies --;
if (fp != 0)
{
fputs("PAGE: 1 1\n", stderr);
lseek(fp, 0, SEEK_SET);
}
tbytes = 0;
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
{
/*
* Write the print data to the printer...
*/
tbytes += nbytes;
bufptr = buffer;
while (nbytes > 0)
{
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
if (errno == ENOTTY)
wbytes = write(fd, bufptr, nbytes);
if (wbytes < 0)
{
perror("ERROR: Unable to send print file to printer");
break;
}
nbytes -= wbytes;
bufptr += wbytes;
}
if (wbytes < 0)
break;
if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
(unsigned long)tbytes);
}
}
/*
* Close the socket connection and input file and return...
*/
close(fd);
if (fp != 0)
close(fp);
fputs("INFO: Ready to print.\n", stderr);
return (0);
}
/*
* 'decode_device_id()' - Decode the IEEE-1284 device ID string.
*/
void
decode_device_id(int port, /* I - Port number */
const char *device_id, /* I - 1284 device ID string */
char *make_model, /* O - Make/model */
int mmsize, /* I - Size of buffer */
char *uri, /* O - Device URI */
int urisize) /* I - Size of buffer */
{
char *attr, /* 1284 attribute */
*delim, /* 1284 delimiter */
*uriptr, /* Pointer into URI */
*mfg, /* Manufacturer string */
*mdl, /* Model string */
serial_number[1024]; /* Serial number string */
/*
* Look for the description field...
*/
if ((attr = strstr(device_id, "DES:")) != NULL)
attr += 4;
else if ((attr = strstr(device_id, "DESCRIPTION:")) != NULL)
attr += 12;
if ((mfg = strstr(device_id, "MANUFACTURER:")) != NULL)
mfg += 13;
else if ((mfg = strstr(device_id, "MFG:")) != NULL)
mfg += 4;
if ((mdl = strstr(device_id, "MODEL:")) != NULL)
mdl += 6;
else if ((mdl = strstr(device_id, "MDL:")) != NULL)
mdl += 4;
if (attr)
{
if (strncasecmp(attr, "Hewlett-Packard ", 16) == 0)
{
strlcpy(make_model, "HP ", mmsize);
strlcpy(make_model + 3, attr + 16, mmsize - 3);
}
else
{
strlcpy(make_model, attr, mmsize);
}
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
}
else if (mfg && mdl)
{
/*
* Build a make-model string from the manufacturer and model attributes...
*/
strlcpy(make_model, mfg, mmsize);
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
strlcat(make_model, " ", mmsize);
strlcat(make_model, mdl, mmsize);
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
}
else
{
/*
* Use "Unknown" as the printer make and model...
*/
strlcpy(make_model, "Unknown", mmsize);
}
/*
* Look for the serial number field...
*/
if ((attr = strstr(device_id, "SERN:")) != NULL)
attr += 5;
else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL)
attr += 13;
if (attr)
{
strlcpy(serial_number, attr, sizeof(serial_number));
if ((delim = strchr(serial_number, ';')) != NULL)
*delim = '\0';
}
else
serial_number[0] = '\0';
/*
* Generate the device URI from the make_model and serial number strings.
*/
strlcpy(uri, "usb://", urisize);
for (uriptr = uri + 6, delim = make_model;
*delim && uriptr < (uri + urisize - 1);
delim ++)
if (*delim == ' ')
{
delim ++;
*uriptr++ = '/';
break;
}
else
*uriptr++ = *delim;
for (; *delim && uriptr < (uri + urisize - 3); delim ++)
if (*delim == ' ')
{
*uriptr++ = '%';
*uriptr++ = '2';
*uriptr++ = '0';
}
else
*uriptr++ = *delim;
*uriptr = '\0';
if (serial_number[0])
{
/*
* Add the serial number to the URI...
*/
strlcat(uri, "?serial=", urisize);
strlcat(uri, serial_number, urisize);
}
}
/*
* 'list_devices()' - List all USB devices.
*/
void
list_devices(void)
{
#ifdef __linux
int i; /* Looping var */
int length; /* Length of device ID info */
int fd; /* File descriptor */
char format[255], /* Format for device filename */
device[255], /* Device filename */
device_id[1024], /* Device ID string */
device_uri[1024], /* Device URI string */
make_model[1024]; /* Make and model */
/*
* First figure out which USB printer filename to use...
*/
if (access("/dev/usb/lp0", 0) == 0)
strcpy(format, "/dev/usb/lp%d");
else if (access("/dev/usb/usblp0", 0) == 0)
strcpy(format, "/dev/usb/usblp%d");
else
strcpy(format, "/dev/usblp%d");
/*
* Then open each USB device...
*/
for (i = 0; i < 16; i ++)
{
sprintf(device, format, i);
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
{
if (ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof(device_id)), device_id) == 0)
{
length = (((unsigned)device_id[0] & 255) << 8) +
((unsigned)device_id[1] & 255);
/*
* Check to see if the length is larger than our buffer; first
* assume that the vendor incorrectly implemented the 1284 spec,
* and then limit the length to the size of our buffer...
*/
if (length > (sizeof(device_id) - 2))
length = (((unsigned)device_id[1] & 255) << 8) +
((unsigned)device_id[0] & 255);
if (length > (sizeof(device_id) - 2))
length = sizeof(device_id) - 2;
memmove(device_id, device_id + 2, length);
device_id[length] = '\0';
}
else
device_id[0] = '\0';
close(fd);
}
else
device_id[0] = '\0';
if (device_id[0])
{
decode_device_id(i, device_id, make_model, sizeof(make_model),
device_uri, sizeof(device_uri));
printf("direct %s \"%s\" \"USB Printer #%d\"\n", device_uri,
make_model, i + 1);
}
else
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
}
#elif defined(__sgi)
#elif defined(__sun)
int i; /* Looping var */
int fd; /* File descriptor */
char device[255], /* Device filename */
device_id[1024], /* Device ID string */
device_uri[1024], /* Device URI string */
make_model[1024]; /* Make and model */
# ifdef ECPPIOC_GETDEVID
struct ecpp_device_id did; /* Device ID buffer */
# endif /* ECPPIOC_GETDEVID */
/*
* Open each USB device...
*/
for (i = 0; i < 8; i ++)
{
sprintf(device, "/dev/usb/printer%d", i);
# ifndef ECPPIOC_GETDEVID
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
# else
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
{
did.mode = ECPP_CENTRONICS;
did.len = sizeof(device_id);
did.rlen = 0;
did.addr = device_id;
if (ioctl(fd, ECPPIOC_GETDEVID, &did) == 0)
{
if (did.rlen < (sizeof(device_id) - 1))
device_id[did.rlen] = '\0';
else
device_id[sizeof(device_id) - 1] = '\0';
}
else
device_id[0] = '\0';
close(fd);
}
else
device_id[0] = '\0';
if (device_id[0])
{
decode_device_id(i, device_id, make_model, sizeof(make_model),
device_uri, sizeof(device_uri));
printf("direct %s \"%s\" \"USB Printer #%d\"\n", device_uri,
make_model, i + 1);
}
else
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
# endif /* !ECPPIOC_GETDEVID */
}
#elif defined(__hpux)
#elif defined(__osf)
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
int i; /* Looping var */
char device[255]; /* Device filename */
for (i = 0; i < 8; i ++)
{
sprintf(device, "/dev/ulpt%d", i);
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
sprintf(device, "/dev/unlpt%d", i);
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d (no reset)\"\n", device, i + 1);
}
#endif
}
/*
* 'open_device()' - Open a USB device...
*/
int /* O - File descriptor or -1 on error */
open_device(const char *uri) /* I - Device URI */
{
/*
* The generic implementation just treats the URI as a device filename...
* Specific operating systems may also support using the device serial
* number and/or make/model.
*/
if (strncmp(uri, "usb:/dev/", 9) == 0)
return (open(uri + 4, O_RDWR | O_EXCL));
#ifdef __linux
else if (strncmp(uri, "usb://", 6) == 0)
{
/*
* For Linux, try looking up the device serial number or model...
*/
int i; /* Looping var */
int length; /* Length of device ID info */
int fd; /* File descriptor */
char format[255], /* Format for device filename */
device[255], /* Device filename */
device_id[1024], /* Device ID string */
make_model[1024], /* Make and model */
device_uri[1024]; /* Device URI string */
/*
* First figure out which USB printer filename to use...
*/
if (access("/dev/usb/lp0", 0) == 0)
strcpy(format, "/dev/usb/lp%d");
else if (access("/dev/usb/usblp0", 0) == 0)
strcpy(format, "/dev/usb/usblp%d");
else
strcpy(format, "/dev/usblp%d");
/*
* Then find the correct USB device...
*/
for (i = 0; i < 16; i ++)
{
sprintf(device, format, i);
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
{
if (ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof(device_id)), device_id) == 0)
{
length = (((unsigned)device_id[0] & 255) << 8) +
((unsigned)device_id[1] & 255);
memmove(device_id, device_id + 2, length);
device_id[length] = '\0';
}
else
device_id[0] = '\0';
}
else
device_id[0] = '\0';
if (device_id[0])
{
/*
* Got the device ID - is this the one?
*/
decode_device_id(i, device_id, make_model, sizeof(make_model),
device_uri, sizeof(device_uri));
if (strcmp(uri, device_uri) == 0)
{
/*
* Yes, return this file descriptor...
*/
fprintf(stderr, "DEBUG: Printer using device file \"%s\"...\n", device);
return (fd);
}
}
/*
* This wasn't the one...
*/
close(fd);
}
/*
* Couldn't find the printer, return "no such device or address"...
*/
errno = ENODEV;
return (-1);
}
#elif defined(__sun) && defined(ECPPIOC_GETDEVID)
else if (strncmp(uri, "usb://", 6) == 0)
{
/*
* For Solaris, try looking up the device serial number or model...
*/
int i; /* Looping var */
int fd; /* File descriptor */
char device[255], /* Device filename */
device_id[1024], /* Device ID string */
make_model[1024], /* Make and model */
device_uri[1024]; /* Device URI string */
struct ecpp_device_id did; /* Device ID buffer */
/*
* Find the correct USB device...
*/
for (i = 0; i < 8; i ++)
{
sprintf(device, "/dev/usb/printer%d", i);
if ((fd = open(device, O_RDWR | O_EXCL)) >= 0)
{
did.mode = ECPP_CENTRONICS;
did.len = sizeof(device_id);
did.rlen = 0;
did.addr = device_id;
if (ioctl(fd, ECPPIOC_GETDEVID, &did) == 0)
{
if (did.rlen < (sizeof(device_id) - 1))
device_id[did.rlen] = '\0';
else
device_id[sizeof(device_id) - 1] = '\0';
}
else
device_id[0] = '\0';
}
else
device_id[0] = '\0';
if (device_id[0])
{
/*
* Got the device ID - is this the one?
*/
decode_device_id(i, device_id, make_model, sizeof(make_model),
device_uri, sizeof(device_uri));
if (strcmp(uri, device_uri) == 0)
return (fd); /* Yes, return this file descriptor... */
}
/*
* This wasn't the one...
*/
close(fd);
}
/*
* Couldn't find the printer, return "no such device or address"...
*/
errno = ENODEV;
return (-1);
}
#endif /* __linux */
else
{
errno = ENODEV;
return (-1);
}
}
/*
* End of "$Id$".
*/
+4
Ver Arquivo
@@ -0,0 +1,4 @@
lpc
lpq
lpr
lprm
+12
Ver Arquivo
@@ -0,0 +1,12 @@
# DO NOT DELETE
lpc.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
lpc.o: ../cups/ppd.h ../cups/language.h ../cups/debug.h ../cups/string.h
lpc.o: ../config.h
lpq.o: ../cups/string.h ../config.h ../cups/cups.h ../cups/ipp.h
lpq.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h ../cups/language.h
lpq.o: ../cups/debug.h
lpr.o: ../cups/string.h ../config.h ../cups/cups.h ../cups/ipp.h
lpr.o: ../cups/http.h ../cups/md5.h ../cups/ppd.h
lprm.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
lprm.o: ../cups/ppd.h ../cups/language.h ../cups/string.h ../config.h
+46 -16
Ver Arquivo
@@ -3,7 +3,7 @@
#
# Berkeley commands makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -14,7 +14,7 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
@@ -24,8 +24,9 @@
include ../Makedefs
TARGETS = lpc lpr lprm
OBJS = lpc.o lpr.o lprm.o
TARGETS = lpc lpq lpr lprm
OBJS = lpc.o lpq.o lpr.o lprm.o
#
# Make all targets...
@@ -33,49 +34,78 @@ OBJS = lpc.o lpr.o lprm.o
all: $(TARGETS)
#
# Clean all object files...
#
clean:
rm -f $(OBJS) $(TARGETS)
$(RM) $(OBJS) $(TARGETS)
#
# Update dependencies (without system header dependencies...)
#
depend:
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
#
# Install all targets...
#
install:
-$(MKDIR) $(BINDIR)
-$(MKDIR) $(SBINDIR)
$(CP) lpr lprm $(BINDIR)
$(CP) lpc $(SBINDIR)
install: all
$(INSTALL_DIR) $(BINDIR)
$(INSTALL_BIN) lpq $(BINDIR)
$(INSTALL_BIN) lpr $(BINDIR)
$(INSTALL_BIN) lprm $(BINDIR)
$(INSTALL_DIR) $(SBINDIR)
$(INSTALL_BIN) lpc $(SBINDIR)
#
# lpc
#
lpc: lpc.o ../cups/libcups.a
lpc: lpc.o ../cups/$(LIBCUPS)
echo Linking $@...
$(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)
#
# lpr
#
lpr: lpr.o ../cups/libcups.a
lpr: lpr.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o lpr lpr.o $(LIBS)
lpr.o: ../cups/cups.h ../Makedefs
#
# lprm
#
lprm: lprm.o ../cups/libcups.a
lprm: lprm.o ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(LDFLAGS) -o lprm lprm.o $(LIBS)
lprm.o: ../cups/cups.h ../Makedefs
#
# Dependencies...
#
include Dependencies
#
# End of "$Id$".
+54 -24
Ver Arquivo
@@ -3,7 +3,7 @@
*
* "lpc" command for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -40,6 +40,7 @@
#include <cups/cups.h>
#include <cups/language.h>
#include <cups/debug.h>
#include <cups/string.h>
/*
@@ -60,7 +61,6 @@ int
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i; /* Looping var */
http_t *http; /* Connection to server */
char line[1024], /* Input line from user */
*params; /* Pointer to parameters */
@@ -70,7 +70,7 @@ main(int argc, /* I - Number of command-line arguments */
* Connect to the scheduler...
*/
http = httpConnect("localhost", ippPort());
http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption());
if (argc > 1)
{
@@ -87,14 +87,20 @@ main(int argc, /* I - Number of command-line arguments */
*/
printf("lpc> ");
while (gets(line) != NULL)
while (fgets(line, sizeof(line), stdin) != NULL)
{
/*
* Strip the trailing newline...
*/
line[strlen(line) - 1] = '\0';
/*
* Find any options in the string...
*/
while (isspace(line[0]))
strcpy(line, line + 1);
cups_strcpy(line, line + 1);
for (params = line; *params != '\0'; params ++)
if (isspace(*params))
@@ -173,7 +179,7 @@ do_command(http_t *http, /* I - HTTP connection to server */
strcmp(command, "?") == 0)
show_help(params);
else
puts("?Invalid command");
printf("%s is not implemented by the CUPS version of lpc.\n", command);
}
@@ -211,7 +217,8 @@ show_status(http_t *http, /* I - HTTP connection to server */
ipp_t *request, /* IPP Request */
*response, /* IPP Response */
*jobs; /* IPP Get Jobs response */
ipp_attribute_t *attr; /* Current attribute */
ipp_attribute_t *attr, /* Current attribute */
*jattr; /* Current job attribute */
cups_lang_t *language; /* Default language */
char *printer, /* Printer name */
*device; /* Device URI */
@@ -223,9 +230,16 @@ show_status(http_t *http, /* I - HTTP connection to server */
int match; /* Non-zero if this job matches */
char printer_uri[HTTP_MAX_URI];
/* Printer URI */
static const char *requested[] =
{ /* Requested attributes */
"printer-name",
"device-uri",
"printer-state",
"printer-is-accepting-jobs"
};
DEBUG_printf(("show_printers(%08x, %08x)\n", http, dests));
DEBUG_printf(("show_status(%08x, %08x)\n", http, dests));
if (http == NULL)
return;
@@ -245,11 +259,15 @@ show_status(http_t *http, /* I - HTTP connection to server */
language = cupsLangDefault();
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
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);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", sizeof(requested) / sizeof(requested[0]),
NULL, requested);
/*
* Do the request and get back a response...
@@ -257,7 +275,7 @@ show_status(http_t *http, /* I - HTTP connection to server */
if ((response = cupsDoRequest(http, request, "/printers/")) != NULL)
{
DEBUG_puts("show_printers: request succeeded...");
DEBUG_puts("show_status: request succeeded...");
/*
* Loop through the printers returned in the list and display
@@ -397,22 +415,26 @@ show_status(http_t *http, /* I - HTTP connection to server */
language = cupsLangDefault();
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL,
cupsLangEncoding(language));
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);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL,
language->language);
sprintf(printer_uri, "http://localhost/printers/%s", printer);
attr = ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, printer_uri);
snprintf(printer_uri, sizeof(printer_uri),
"ipp://localhost/printers/%s", printer);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, printer_uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", NULL, "job-id");
if ((jobs = cupsDoRequest(http, request, "/jobs/")) != NULL)
{
for (attr = jobs->attrs; attr != NULL; attr = attr->next)
if (strcmp(attr->name, "job-id") == 0)
for (jattr = jobs->attrs; jattr != NULL; jattr = jattr->next)
if (jattr->name && strcmp(jattr->name, "job-id") == 0)
jobcount ++;
ippDelete(jobs);
@@ -427,7 +449,15 @@ 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");
+573
Ver Arquivo
@@ -0,0 +1,573 @@
/*
* "$Id$"
*
* "lpq" command for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* main() - Parse options and commands.
* show_jobs() - Show jobs.
* show_printer() - Show printer status.
* usage() - Show program usage.
*/
/*
* Include necessary headers...
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <cups/string.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);
static void show_printer(http_t *, const char *);
static void usage(void);
/*
* '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 */
char *instance; /* Printer instance */
int id, /* Desired job ID */
interval, /* Reporting interval */
longstatus; /* Show file details */
int num_dests; /* Number of destinations */
cups_dest_t *dests; /* Destinations */
#ifdef HAVE_SSL
http_encryption_t encryption; /* Encryption? */
#endif /* HAVE_SSL */
/*
* Connect to the scheduler...
*/
if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
cupsEncryption())) == NULL)
{
fputs("lpq: Unable to contact server!\n", stderr);
return (1);
}
/*
* Check for command-line options...
*/
dest = NULL;
user = NULL;
id = 0;
interval = 0;
longstatus = 0;
num_dests = cupsGetDests(&dests);
for (i = 0; i < num_dests; i ++)
if (dests[i].is_default)
dest = dests[i].name;
for (i = 1; i < argc; i ++)
if (argv[i][0] == '+')
interval = atoi(argv[i] + 1);
else if (argv[i][0] == '-')
{
switch (argv[i][1])
{
case 'E' : /* Encrypt */
#ifdef HAVE_SSL
encryption = HTTP_ENCRYPT_REQUIRED;
if (http)
httpEncryption(http, encryption);
#else
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
argv[0]);
#endif /* HAVE_SSL */
break;
case 'P' : /* Printer */
if (argv[i][2])
dest = argv[i] + 2;
else
{
i ++;
if (i >= argc)
{
httpClose(http);
cupsFreeDests(num_dests, dests);
usage();
}
dest = argv[i];
}
if ((instance = strchr(dest, '/')) != NULL)
*instance++ = '\0';
if (cupsGetDest(dest, instance, num_dests, dests) == NULL)
{
if (instance)
fprintf(stderr, "lpq: Unknown destination \"%s/%s\"!\n",
dest, instance);
else
fprintf(stderr, "lpq: Unknown destination \"%s\"!\n", dest);
return (1);
}
break;
case 'a' : /* All printers */
dest = NULL;
break;
case 'l' : /* Long status */
longstatus = 1;
break;
default :
httpClose(http);
cupsFreeDests(num_dests, dests);
usage();
break;
}
}
else if (isdigit(argv[i][0]))
id = atoi(argv[i]);
else
user = argv[i];
/*
* Show the status in a loop...
*/
for (;;)
{
if (dest)
show_printer(http, dest);
i = show_jobs(http, dest, user, id, longstatus);
if (i && interval)
{
fflush(stdout);
sleep(interval);
}
else
break;
}
/*
* Close the connection to the server and return...
*/
cupsFreeDests(num_dests, dests);
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 */
#ifdef __osf__
jobpriority, /* job-priority */
#endif /* __osf__ */
jobcount, /* Number of jobs */
jobcopies, /* Number of copies */
rank; /* Rank of job */
char resource[1024]; /* Resource string */
char rankstr[255]; /* Rank string */
char namestr[1024]; /* Job name string */
static const char *ranks[10] =/* Ranking strings */
{
"th",
"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, "printer-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...
*/
jobcount = 0;
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
if (response->request.status.status_code > IPP_OK_CONFLICT)
{
fprintf(stderr, "lpq: get-jobs failed: %s\n",
ippErrorString(response->request.status.status_code));
ippDelete(response);
return (0);
}
rank = 1;
/*
* 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;
#ifdef __osf__
jobpriority = 50;
#endif /* __osf__ */
jobstate = IPP_JOB_PENDING;
jobname = "untitled";
jobuser = NULL;
jobdest = NULL;
jobcopies = 1;
while (attr != NULL && attr->group_tag == IPP_TAG_JOB)
{
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;
#ifdef __osf__
if (strcmp(attr->name, "job-priority") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
jobpriority = attr->values[0].integer;
#endif /* __osf__ */
if (strcmp(attr->name, "job-state") == 0 &&
attr->value_tag == IPP_TAG_ENUM)
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;
if (strcmp(attr->name, "copies") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
jobcopies = attr->values[0].integer;
attr = attr->next;
}
/*
* See if we have everything needed...
*/
if (jobdest == NULL || jobid == 0)
{
if (attr == NULL)
break;
else
continue;
}
if (!longstatus && jobcount == 0)
#ifdef __osf__
puts("Rank Owner Pri Job Files Total Size");
#else
puts("Rank Owner Job File(s) Total Size");
#endif /* __osf__ */
jobcount ++;
/*
* Display the job...
*/
if (jobstate == IPP_JOB_PROCESSING)
strcpy(rankstr, "active");
else
{
snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]);
rank ++;
}
if (longstatus)
{
puts("");
if (jobcopies > 1)
snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies,
jobname);
else
strlcpy(namestr, jobname, sizeof(namestr));
printf("%s: %-33.33s [job %d localhost]\n", jobuser, rankstr, jobid);
printf(" %-39.39s %d bytes\n", namestr, jobsize);
}
else
#ifdef __osf__
printf("%-6s %-10.10s %-4d %-10d %-27.27s %d bytes\n", rankstr, jobuser,
jobpriority, jobid, jobname, jobsize);
#else
printf("%-7s %-7.7s %-7d %-31.31s %d bytes\n", rankstr, jobuser,
jobid, jobname, jobsize);
#endif /* __osf */
if (attr == NULL)
break;
}
ippDelete(response);
}
else
{
fprintf(stderr, "lpq: get-jobs failed: %s\n", ippErrorString(cupsLastError()));
return (0);
}
if (jobcount == 0)
puts("no entries");
return (jobcount);
}
/*
* 'show_printer()' - Show printer status.
*/
static void
show_printer(http_t *http, /* I - HTTP connection to server */
const char *dest) /* I - Destination */
{
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
ipp_pstate_t state; /* Printer state */
char uri[HTTP_MAX_URI];
/* Printer URI */
if (http == NULL)
return;
/*
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request = ippNew();
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", dest);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
if (response->request.status.status_code > IPP_OK_CONFLICT)
{
fprintf(stderr, "lpq: get-printer-attributes failed: %s\n",
ippErrorString(response->request.status.status_code));
ippDelete(response);
return;
}
if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL)
state = (ipp_pstate_t)attr->values[0].integer;
else
state = IPP_PRINTER_STOPPED;
switch (state)
{
case IPP_PRINTER_IDLE :
printf("%s is ready\n", dest);
break;
case IPP_PRINTER_PROCESSING :
printf("%s is ready and printing\n", dest);
break;
case IPP_PRINTER_STOPPED :
printf("%s is not ready\n", dest);
break;
}
ippDelete(response);
}
else
fprintf(stderr, "lpq: get-printer-attributes failed: %s\n",
ippErrorString(cupsLastError()));
}
/*
* 'usage()' - Show program usage.
*/
static void
usage(void)
{
fputs("Usage: lpq [-P dest] [-l] [+interval]\n", stderr);
exit(1);
}
/*
* End of "$Id$".
*/
+267 -64
Ver Arquivo
@@ -3,7 +3,7 @@
*
* "lpr" command for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -23,7 +23,8 @@
*
* Contents:
*
* main() - Parse options and send files for printing.
* main() - Parse options and send files for printing.
* sighandler() - Signal catcher for when we print from stdin...
*/
/*
@@ -32,9 +33,32 @@
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cups/string.h>
#include <cups/cups.h>
#ifndef WIN32
# include <unistd.h>
# 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.
*/
@@ -43,23 +67,33 @@ int
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i; /* Looping var */
int i, j; /* Looping var */
int job_id; /* Job ID */
char *dest; /* Destination printer */
char *title; /* Job title */
int priority; /* Job priority (1-100) */
char ch; /* Option character */
char *printer, /* Destination printer or class */
*instance; /* Instance */
const char *title; /* Job title */
int num_copies; /* Number of copies per file */
int num_files; /* Number of files printed */
int num_files; /* Number of files to print */
const char *files[1000]; /* Files to print */
int num_dests; /* Number of destinations */
cups_dest_t *dests, /* Destinations */
*dest; /* Selected destination */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
int silent; /* Silent or verbose output? */
char tempfile[1024]; /* Temporary file for printing from stdin */
int deletefile; /* Delete file after print? */
char buffer[8192]; /* Copy buffer */
FILE *temp; /* Temporary file pointer */
int temp; /* Temporary file descriptor */
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action; /* Signal action */
struct sigaction oldaction; /* Old signal action */
#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
silent = 0;
dest = cupsGetDefault();
deletefile = 0;
printer = NULL;
num_dests = 0;
dests = NULL;
num_options = 0;
options = NULL;
num_files = 0;
@@ -67,12 +101,34 @@ main(int argc, /* I - Number of command-line arguments */
for (i = 1; i < argc; i ++)
if (argv[i][0] == '-')
switch (argv[i][1])
switch (ch = argv[i][1])
{
case 'E' : /* Encrypt */
#ifdef HAVE_SSL
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
#else
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
argv[0]);
#endif /* HAVE_SSL */
break;
case '1' : /* TROFF font set 1 */
case '2' : /* TROFF font set 2 */
case '3' : /* TROFF font set 3 */
case '4' : /* TROFF font set 4 */
case 'i' : /* indent */
case 'w' : /* width */
if (argv[i][2] == '\0')
{
i ++;
if (i >= argc)
{
fprintf(stderr, "lpr: Expected value after -%c option!\n", ch);
return (1);
}
}
case 'c' : /* CIFPLOT */
case 'd' : /* DVI */
case 'f' : /* FORTRAN */
@@ -81,32 +137,81 @@ main(int argc, /* I - Number of command-line arguments */
case 't' : /* Troff */
case 'v' : /* Raster image */
fprintf(stderr, "Warning: \'%c\' format modifier not supported - output may not be correct!\n",
argv[i][1]);
ch);
break;
case 'o' : /* Option */
if (argv[i][2] != '\0')
num_options = cupsParseOptions(argv[i] + 2, num_options, &options);
else
{
i ++;
if (i >= argc)
{
fputs("lpr: Expected option=value after -o option!\n", stderr);
return (1);
}
num_options = cupsParseOptions(argv[i], num_options, &options);
}
break;
case 'l' : /* Literal/raw */
num_options = cupsParseOptions("raw", num_options, &options);
num_options = cupsAddOption("raw", "", num_options, &options);
break;
case 'p' : /* Prettyprint */
num_options = cupsParseOptions("prettyprint", num_options, &options);
num_options = cupsAddOption("prettyprint", "", num_options, &options);
break;
case 'h' : /* Suppress burst page */
num_options = cupsAddOption("job-sheets", "none", num_options, &options);
break;
case 's' : /* Don't use symlinks */
break;
case 'm' : /* mail on completion */
case 'm' : /* Mail on completion */
fputs("Warning: email notification is not supported!\n", stderr);
break;
case 'q' : /* Queue file but don't print */
num_options = cupsAddOption("job-hold-until", "indefinite",
num_options, &options);
break;
case 'r' : /* Remove file after printing */
deletefile = 1;
break;
case 'P' : /* Destination printer or class */
if (argv[i][2] != '\0')
dest = argv[i] + 2;
printer = argv[i] + 2;
else
{
i ++;
dest = argv[i];
if (i >= argc)
{
fputs("lpr: Expected destination after -P option!\n", stderr);
return (1);
}
printer = argv[i];
}
if ((instance = strrchr(printer, '/')) != NULL)
*instance++ = '\0';
if (num_dests == 0)
num_dests = cupsGetDests(&dests);
if ((dest = cupsGetDest(printer, instance, num_dests, dests)) != NULL)
{
for (j = 0; j < dest->num_options; j ++)
if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
num_options = cupsAddOption(dest->options[j].name,
dest->options[j].value,
num_options, &options);
}
break;
@@ -116,13 +221,13 @@ main(int argc, /* I - Number of command-line arguments */
else
{
i ++;
num_copies = atoi(argv[i]);
}
if (i >= argc)
{
fputs("lpr: Expected copy count after -# option!\n", stderr);
return (1);
}
if (num_copies < 1 || num_copies > 100)
{
fputs("lpr: Number copies must be between 1 and 100.\n", stderr);
return (1);
num_copies = atoi(argv[i]);
}
sprintf(buffer, "%d", num_copies);
@@ -137,73 +242,145 @@ main(int argc, /* I - Number of command-line arguments */
else
{
i ++;
if (i >= argc)
{
fprintf(stderr, "lpr: Expected name after -%c option!\n", ch);
return (1);
}
title = argv[i];
}
break;
case 'U' : /* User */
if (argv[i][2] != '\0')
cupsSetUser(argv[i] + 2);
else
{
i ++;
if (i >= argc)
{
fputs("lpr: Expected username after -U option!\n", stderr);
return (1);
}
cupsSetUser(argv[i]);
}
break;
default :
fprintf(stderr, "lpr: Unknown option \'%c\'!\n", argv[i][1]);
return (1);
}
else
else if (num_files < 1000)
{
/*
* Print a file...
*/
if (dest == NULL)
if (access(argv[i], R_OK) != 0)
{
fputs("lpr: error - no default destination available.\n", stderr);
return (1);
fprintf(stderr, "lpr: Unable to access \"%s\" - %s\n", argv[i],
strerror(errno));
return (1);
}
files[num_files] = argv[i];
num_files ++;
if (title)
job_id = cupsPrintFile(dest, argv[i], title, num_options, options);
else
{
char *filename;
if ((filename = strrchr(argv[i], '/')) != NULL)
filename ++;
if (title == NULL)
{
if ((title = strrchr(argv[i], '/')) != NULL)
title ++;
else
filename = argv[i];
job_id = cupsPrintFile(dest, argv[i], filename, num_options, options);
}
if (job_id < 1)
{
fprintf(stderr, "lpr: unable to print file \'%s\'.\n", argv[i]);
return (1);
title = argv[i];
}
}
else
fprintf(stderr, "lpr: Too many files - \"%s\"\n", argv[i]);
/*
* See if we printed anything; if not, print from stdin...
* See if we have any files to print; if not, print from stdin...
*/
if (num_files == 0)
if (printer == NULL)
{
if (dest == NULL)
if (num_dests == 0)
num_dests = cupsGetDests(&dests);
if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL)
{
fputs("lpr: error - no default destination available.\n", stderr);
return (1);
printer = dest->name;
for (j = 0; j < dest->num_options; j ++)
if (cupsGetOption(dest->options[j].name, num_options, options) == NULL)
num_options = cupsAddOption(dest->options[j].name,
dest->options[j].value,
num_options, &options);
}
}
temp = fopen(tmpnam(tempfile), "w");
if (printer == NULL)
{
if (cupsLastError() >= IPP_BAD_REQUEST)
fputs("lpr: error - scheduler not responding!\n", stderr);
else
fputs("lpr: error - no default destination available.\n", stderr);
if (temp == NULL)
return (1);
}
if (num_files > 0)
{
job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options);
if (deletefile)
{
/*
* Delete print files after printing...
*/
for (i = 0; i < num_files; i ++)
unlink(files[i]);
}
}
else
{
num_files = 1;
#ifndef WIN32
# if defined(HAVE_SIGSET)
sigset(SIGHUP, sighandler);
if (sigset(SIGINT, sighandler) == SIG_IGN)
sigset(SIGINT, SIG_IGN);
sigset(SIGTERM, sighandler);
# elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
action.sa_handler = sighandler;
sigaction(SIGHUP, &action, NULL);
sigaction(SIGINT, NULL, &oldaction);
if (oldaction.sa_handler != SIG_IGN)
sigaction(SIGINT, &action, NULL);
sigaction(SIGTERM, &action, NULL);
# else
signal(SIGHUP, sighandler);
if (signal(SIGINT, sighandler) == SIG_IGN)
signal(SIGINT, SIG_IGN);
signal(SIGTERM, sighandler);
# endif
#endif /* !WIN32 */
if ((temp = cupsTempFd(tempfile, sizeof(tempfile))) < 0)
{
fputs("lpr: unable to create temporary file.\n", stderr);
return (1);
}
while ((i = fread(buffer, 1, sizeof(buffer), stdin)) > 0)
fwrite(buffer, 1, i, temp);
while ((i = read(0, buffer, sizeof(buffer))) > 0)
write(temp, buffer, i);
i = ftell(temp);
fclose(temp);
i = lseek(temp, 0, SEEK_CUR);
close(temp);
if (i == 0)
{
@@ -212,21 +389,47 @@ main(int argc, /* I - Number of command-line arguments */
}
if (title)
job_id = cupsPrintFile(dest, tempfile, title, num_options, options);
job_id = cupsPrintFile(printer, tempfile, title, num_options, options);
else
job_id = cupsPrintFile(dest, tempfile, "(stdin)", num_options, options);
job_id = cupsPrintFile(printer, tempfile, "(stdin)", num_options, options);
if (job_id < 1)
{
fprintf(stderr, "lpr: unable to print file \'%s\'.\n", argv[i]);
return (1);
}
unlink(tempfile);
}
if (job_id < 1)
{
fprintf(stderr, "lpr: unable to print file: %s\n",
ippErrorString(cupsLastError()));
return (1);
}
return (0);
}
#ifndef WIN32
/*
* 'sighandler()' - Signal catcher for when we print from stdin...
*/
void
sighandler(int s) /* I - Signal number */
{
/*
* Remove the temporary file we're using to print from stdin...
*/
unlink(tempfile);
/*
* Exit...
*/
exit(s);
}
#endif /* !WIN32 */
/*
* End of "$Id$".
*/
+89 -12
Ver Arquivo
@@ -3,7 +3,7 @@
*
* "lprm" command for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -14,7 +14,7 @@
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44145 Airport View Drive, Suite 204
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
@@ -32,10 +32,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <cups/cups.h>
#include <cups/language.h>
#include <cups/string.h>
/*
@@ -49,30 +49,43 @@ 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 */
char *dest; /* Destination printer */
const char *dest; /* Destination printer */
char *instance; /* Pointer to instance name */
char uri[1024]; /* Printer or job URI */
ipp_t *request; /* IPP request */
ipp_t *response; /* IPP response */
ipp_op_t op; /* Operation */
cups_lang_t *language; /* Language */
int num_dests; /* Number of destinations */
cups_dest_t *dests; /* Destinations */
http_encryption_t encryption; /* Encryption? */
/*
* Setup to cancel individual print jobs...
*/
op = IPP_CANCEL_JOB;
job_id = 0;
dest = cupsGetDefault();
response = NULL;
op = IPP_CANCEL_JOB;
job_id = 0;
dest = NULL;
response = NULL;
http = NULL;
encryption = cupsEncryption();
num_dests = cupsGetDests(&dests);
for (i = 0; i < num_dests; i ++)
if (dests[i].is_default)
dest = dests[i].name;
/*
* Open a connection to the server...
*/
if ((http = httpConnect("localhost", ippPort())) == NULL)
if ((http = httpConnectEncrypt(cupsServer(), ippPort(), encryption)) == NULL)
{
fputs("lprm: Unable to contact server!\n", stderr);
cupsFreeDests(num_dests, dests);
return (1);
}
@@ -84,6 +97,17 @@ main(int argc, /* I - Number of command-line arguments */
if (argv[i][0] == '-' && argv[i][1] != '\0')
switch (argv[i][1])
{
case 'E' : /* Encrypt */
#ifdef HAVE_SSL
encryption = HTTP_ENCRYPT_REQUIRED;
httpEncryption(http, encryption);
#else
fprintf(stderr, "%s: Sorry, no encryption support compiled in!\n",
argv[0]);
#endif /* HAVE_SSL */
break;
case 'P' : /* Cancel jobs on a printer */
if (argv[i][2])
dest = argv[i] + 2;
@@ -92,10 +116,23 @@ main(int argc, /* I - Number of command-line arguments */
i ++;
dest = argv[i];
}
if ((instance = strchr(dest, '/')) != NULL)
*instance = '\0';
if (cupsGetDest(dest, NULL, num_dests, dests) == NULL)
{
fprintf(stderr, "lprm: Unknown destination \"%s\"!\n", dest);
cupsFreeDests(num_dests, dests);
httpClose(http);
return(1);
}
break;
default :
fprintf(stderr, "lprm: Unknown option \'%c\'!\n", argv[i][1]);
cupsFreeDests(num_dests, dests);
httpClose(http);
return (1);
}
else
@@ -104,7 +141,7 @@ main(int argc, /* I - Number of command-line arguments */
* Cancel a job or printer...
*/
if (isdigit(argv[i][0]))
if (isdigit(argv[i][0]) && cupsGetDest(argv[i], NULL, num_dests, dests) == NULL)
{
dest = NULL;
op = IPP_CANCEL_JOB;
@@ -119,7 +156,10 @@ main(int argc, /* I - Number of command-line arguments */
op = IPP_PURGE_JOBS;
}
else
{
dest = argv[i];
job_id = 0;
}
/*
* Build an IPP request, which requires the following
@@ -146,7 +186,7 @@ main(int argc, /* I - Number of command-line arguments */
if (dest)
{
sprintf(uri, "http://localhost/printers/%s", dest);
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", dest);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id",
@@ -154,11 +194,14 @@ main(int argc, /* I - Number of command-line arguments */
}
else
{
sprintf(uri, "http://localhost/jobs/%d", job_id);
sprintf(uri, "ipp://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...
*/
@@ -169,10 +212,39 @@ 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;
}
if (response->request.status.status_code > IPP_OK_CONFLICT)
{
ippDelete(response);
cupsFreeDests(num_dests, dests);
httpClose(http);
return (1);
}
ippDelete(response);
}
else
{
fputs("lprm: Unable to cancel job(s)!\n", stderr);
cupsFreeDests(num_dests, dests);
httpClose(http);
return (1);
}
}
@@ -186,9 +258,14 @@ main(int argc, /* I - Number of command-line arguments */
if (!cupsCancelJob(dest, 0))
{
fputs("lprm: Unable to cancel job(s)!\n", stderr);
cupsFreeDests(num_dests, dests);
httpClose(http);
return (1);
}
cupsFreeDests(num_dests, dests);
httpClose(http);
return (0);
}
+5
Ver Arquivo
@@ -0,0 +1,5 @@
admin.cgi
classes.cgi
jobs.cgi
libcgi.a
printers.cgi
+20
Ver Arquivo
@@ -0,0 +1,20 @@
# DO NOT DELETE
html.o: cgi.h ../cups/string.h ../config.h
ipp-var.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
ipp-var.o: ../cups/md5.h ../cups/ppd.h ../cups/debug.h ../cups/language.h
ipp-var.o: ../cups/string.h ../config.h cgi.h
template.o: cgi.h ../cups/string.h ../config.h
var.o: cgi.h ../cups/string.h ../config.h
admin.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
admin.o: ../cups/ppd.h ../cups/debug.h ../cups/language.h ../cups/string.h
admin.o: ../config.h cgi.h
classes.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
classes.o: ../cups/md5.h ../cups/ppd.h ../cups/debug.h ../cups/language.h
classes.o: ../cups/string.h ../config.h cgi.h
jobs.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/md5.h
jobs.o: ../cups/ppd.h ../cups/debug.h ../cups/language.h ../cups/string.h
jobs.o: ../config.h cgi.h
printers.o: ipp-var.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
printers.o: ../cups/md5.h ../cups/ppd.h ../cups/debug.h ../cups/language.h
printers.o: ../cups/string.h ../config.h cgi.h
+72 -12
Ver Arquivo
@@ -3,7 +3,7 @@
#
# CGI makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products.
# Copyright 1997-2003 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -14,7 +14,7 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
@@ -24,9 +24,11 @@
include ../Makedefs
#TARGETS = classes.cgi jobs.cgi printers.cgi
TARGETS = printers.cgi
OBJS = classes.o jobs.o printers.o
CGIS = admin.cgi classes.cgi jobs.cgi printers.cgi
TARGETS = libcgi.a $(CGIS)
LIBOBJS = html.o ipp-var.o template.o var.o
OBJS = $(LIBOBJS) admin.o classes.o jobs.o printers.o
#
# Make all targets...
@@ -34,29 +36,87 @@ OBJS = classes.o jobs.o printers.o
all: $(TARGETS)
#
# Clean all object files...
#
clean:
rm -f $(OBJS) $(TARGETS)
$(RM) $(OBJS) $(TARGETS)
#
# Update dependencies (without system header dependencies...)
#
depend:
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
#
# Install all targets...
#
install:
-$(MKDIR) $(SERVERROOT)/cgi-bin
$(CP) $(TARGETS) $(SERVERROOT)/cgi-bin
install: all
$(INSTALL_DIR) $(SERVERBIN)/cgi-bin
for file in $(CGIS); do \
$(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \
done
#
# libcgi.a
#
libcgi.a: $(LIBOBJS)
echo Archiving $@...
$(RM) $@
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
$(RANLIB) $@
#
# admin.cgi
#
admin.cgi: admin.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ admin.o libcgi.a $(LIBS)
#
# classes.cgi
#
classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ classes.o libcgi.a $(LIBS)
#
# jobs.cgi
#
jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ jobs.o libcgi.a $(LIBS)
#
# printers.cgi
#
printers.cgi: printers.o ../Makedefs ../cups/libcups.a
$(CC) $(LDFLAGS) -o $@ printers.o $(LIBS)
printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) libcgi.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ printers.o libcgi.a $(LIBS)
#
# Dependencies...
#
include Dependencies
$(OBJS): ../Makedefs ../cups/cups.h ../cups/ipp.h ../cups/language.h
#
# End of "$Id$".
+1601
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+86
Ver Arquivo
@@ -0,0 +1,86 @@
/*
* "$Id$"
*
* CGI support library definitions.
*
* Copyright 1997-2003 by Easy Software Products.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _CGI_H_
# define _CGI_H_
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <cups/string.h>
# ifdef WIN32
# include <direct.h>
# include <io.h>
# include <malloc.h>
# else
# include <unistd.h>
# endif /* WIN32 */
/*
* Prototypes...
*/
extern int cgiInitialize(void);
extern void cgiAbort(const char *title, const char *stylesheet,
const char *format, ...);
extern int cgiCheckVariables(const char *names);
extern const char *cgiGetArray(const char *name, int element);
extern int cgiGetSize(const char *name);
extern void cgiSetSize(const char *name, int size);
extern const char *cgiGetVariable(const char *name);
extern void cgiSetArray(const char *name, int element,
const char *value);
extern void cgiSetVariable(const char *name, const char *value);
extern void cgiCopyTemplateFile(FILE *out, const char *tmpl);
extern void cgiCopyTemplateLang(FILE *out, const char *directory,
const char *tmpl, const char *lang);
extern void cgiStartHTML(FILE *out, const char *author,
const char *stylesheet,
const char *keywords,
const char *description,
const char *title, ...);
extern void cgiEndHTML(FILE *out);
extern FILE *cgiEMailOpen(const char *from, const char *to,
const char *cc, const char *subject,
int multipart);
extern void cgiEMailPart(FILE *mail, const char *type,
const char *charset, const char *encoding);
extern void cgiEMailClose(FILE *mail);
extern char *cgiGetCookie(const char *name, char *buf, int buflen);
extern void cgiSetCookie(const char *name, const char *value,
const char *path, const char *domain,
time_t expires, int secure);
# define cgiGetUser() getenv("REMOTE_USER")
# define cgiGetHost() (getenv("REMOTE_HOST") == NULL ? getenv("REMOTE_ADDR") : getenv("REMOTE_HOST"))
#endif /* !_CGI_H_ */
/*
* End of "$Id$".
*/
+346
Ver Arquivo
@@ -0,0 +1,346 @@
/*
* "$Id$"
*
* Class status CGI for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* main() - Main entry for CGI.
*/
/*
* Include necessary headers...
*/
#include "ipp-var.h"
/*
* '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 *pclass; /* Printer class name */
http_t *http; /* Connection to the server */
ipp_t *request, /* IPP request */
*response; /* IPP response */
ipp_attribute_t *attr; /* IPP attribute */
ipp_status_t status; /* Operation status... */
char uri[HTTP_MAX_URI]; /* Printer URI */
const char *which_jobs; /* Which jobs to show */
const char *op; /* Operation to perform, if any */
static const char *def_attrs[] = /* Attributes for default printer */
{
"printer-name",
"printer-uri-supported"
};
/*
* Get any form variables...
*/
cgiInitialize();
op = cgiGetVariable("OP");
/*
* Get the request language...
*/
language = cupsLangDefault();
/*
* Connect to the HTTP server...
*/
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
/*
* 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 printers or the status of a
* single printer...
*/
ippSetServerVersion();
pclass = argv[0];
if (strcmp(pclass, "/") == 0 || strcmp(pclass, "classes.cgi") == 0)
{
pclass = NULL;
cgiSetVariable("TITLE", cupsLangString(language, CUPS_MSG_CLASS));
}
else
cgiSetVariable("TITLE", pclass);
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
if (op == NULL || strcasecmp(op, "print-test-page") != 0)
{
/*
* Get the default destination...
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_DEFAULT;
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);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes",
sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs);
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text);
if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
{
char url[HTTP_MAX_URI]; /* New URL */
cgiSetVariable("DEFAULT_URI",
ippRewriteURL(attr->values[0].string.text,
url, sizeof(url)));
}
ippDelete(response);
}
/*
* Get the class info...
*/
request = ippNew();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
if (pclass == NULL)
{
/*
* Build a CUPS_GET_CLASSES request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
*/
request->request.op.operation_id = CUPS_GET_CLASSES;
request->request.op.request_id = 1;
}
else
{
/*
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
request->request.op.request_id = 1;
snprintf(uri, sizeof(uri), "ipp://%s/classes/%s", getenv("SERVER_NAME"),
pclass);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
}
ippGetAttributes(request, TEMPLATES, "classes.tmpl", getenv("LANG"));
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
}
/*
* Write the report...
*/
cgiCopyTemplateLang(stdout, TEMPLATES, "classes.tmpl", getenv("LANG"));
/*
* Get jobs for the specified class if a class has been chosen...
*/
if (pclass != NULL)
{
/*
* Build an IPP_GET_JOBS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request = ippNew();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 1;
snprintf(uri, sizeof(uri), "ipp://%s/classes/%s", getenv("SERVER_NAME"),
pclass);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
NULL, which_jobs);
ippGetAttributes(request, TEMPLATES, "jobs.tmpl", getenv("LANG"));
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
}
}
}
else
{
/*
* Print a test page...
*/
snprintf(uri, sizeof(uri), "ipp://localhost/classes/%s", pclass);
/*
* Build an IPP_PRINT_JOB request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
* requesting-user-name
* document-format
*/
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->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
if (getenv("REMOTE_USER") != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, getenv("REMOTE_USER"));
else
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, "root");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
NULL, "Test Page");
ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
NULL, "application/postscript");
/*
* Do the request and get back a response...
*/
if ((response = cupsDoFileRequest(http, request, uri + 15,
CUPS_DATADIR "/data/testprint.ps")) != NULL)
{
status = response->request.status.status_code;
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
}
else
status = cupsLastError();
cgiSetVariable("PRINTER_NAME", pclass);
if (status > IPP_OK_CONFLICT)
{
cgiSetVariable("ERROR", ippErrorString(status));
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
}
else
cgiCopyTemplateLang(stdout, TEMPLATES, "test-page.tmpl", getenv("LANG"));
}
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
/*
* Close the HTTP server connection...
*/
httpClose(http);
cupsLangFree(language);
/*
* Return with no errors...
*/
return (0);
}
/*
* End of "$Id$".
*/
+89
Ver Arquivo
@@ -0,0 +1,89 @@
/*
* "$Id$"
*
* CGI HTML functions.
*
* Copyright 1997-2003 by Easy Software Products.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Contents:
*
* cgiStartHTML() - Start an HTML document stream.
* cgiEndHTML() - End an HTML document stream.
*/
#include "cgi.h"
#include <stdarg.h>
/*
* 'cgiStartHTML()' - Start an HTML document stream.
*/
void
cgiStartHTML(FILE *out, /* I - Output file to use */
const char *stylesheet, /* I - Stylesheet to use */
const char *author, /* I - Author name */
const char *keywords, /* I - Search keywords */
const char *description, /* I - Description of document */
const char *title, /* I - Title for page */
...) /* I - Any addition args for title */
{
va_list ap; /* Argument pointer */
fputs("Content-type: text/html\n\n", out);
fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" "
"\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n", out);
fputs("<HTML>\n", out);
fputs("<HEAD>\n", out);
fputs("\t<TITLE>\n", out);
va_start(ap, title);
vfprintf(out, title, ap);
va_end(ap);
fputs("</TITLE>\n", out);
if (stylesheet)
fprintf(out, "\t<LINK REL=\"STYLESHEET\" TYPE=\"text/css\" HREF=\"%s\">\n",
stylesheet);
if (author)
fprintf(out, "\t<META NAME=\"AUTHOR\" CONTENT=\"%s\">\n", author);
if (keywords)
fprintf(out, "\t<META NAME=\"KEYWORDS\" CONTENT=\"%s\">\n", keywords);
if (description)
fprintf(out, "\t<META NAME=\"DESCRIPTION\" CONTENT=\"%s\">\n", description);
fputs("</HEAD>\n", out);
fputs("<BODY>\n", out);
}
/*
* 'cgiEndHTML()' - End an HTML document stream.
*/
void
cgiEndHTML(FILE *out) /* I - Output file to use */
{
fputs("</BODY>\n", out);
fputs("</HTML>\n", out);
}
/*
* End of "$Id$".
*/
+547
Ver Arquivo
@@ -0,0 +1,547 @@
/*
* "$Id$"
*
* IPP variable routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ippGetAttributes() - Get the list of attributes that are needed
* by the template file.
* ippGetTemplateDir() - Get the templates directory...
* ippRewriteURL() - Rewrite a printer URI into a web browser URL...
* ippSetServerVersion() - Set the server name and CUPS version...
* ippSetCGIVars() - Set CGI variables from an IPP response.
*/
/*
* Include necessary headers...
*/
#include "ipp-var.h"
/*
* 'ippGetAttributes()' - Get the list of attributes that are needed
* by the template file.
*/
void
ippGetAttributes(ipp_t *request, /* I - IPP request */
const char *directory, /* I - Directory */
const char *tmpl, /* I - Base filename */
const char *lang) /* I - Language */
{
int num_attrs; /* Number of attributes */
char *attrs[1000]; /* Attributes */
int i; /* Looping var */
char filename[1024], /* Filename */
locale[16]; /* Locale name */
FILE *in; /* Input file */
int ch; /* Character from file */
char name[255], /* Name of variable */
*nameptr; /* Pointer into name */
/*
* Convert the language to a locale name...
*/
if (lang != NULL)
{
for (i = 0; lang[i] && i < 15; i ++)
if (isalnum(lang[i]))
locale[i] = tolower(lang[i]);
else
locale[i] = '_';
locale[i] = '\0';
}
else
locale[0] = '\0';
/*
* See if we have a template file for this language...
*/
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
if (access(filename, 0))
{
locale[2] = '\0';
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
if (access(filename, 0))
snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl);
}
/*
* Open the template file...
*/
if ((in = fopen(filename, "r")) == NULL)
return;
/*
* Loop through the file adding attribute names as needed...
*/
num_attrs = 0;
while ((ch = getc(in)) != EOF)
if (ch == '\\')
getc(in);
else if (ch == '{' && num_attrs < (sizeof(attrs) / sizeof(attrs[0])))
{
/*
* Grab the name...
*/
for (nameptr = name; (ch = getc(in)) != EOF;)
if (strchr("}]<>=! \t\n", ch))
break;
else if (nameptr > name && ch == '?')
break;
else if (nameptr < (name + sizeof(name) - 1))
{
if (ch == '_')
*nameptr++ = '-';
else
*nameptr++ = ch;
}
*nameptr = '\0';
/*
* Possibly add it to the list of attributes...
*/
for (i = 0; i < num_attrs; i ++)
if (!strcmp(attrs[i], name))
break;
if (i >= num_attrs)
{
attrs[num_attrs] = strdup(name);
num_attrs ++;
}
}
/*
* If we have attributes, add a requested-attributes attribute to the
* request...
*/
if (num_attrs > 0)
{
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", num_attrs, NULL, (const char **)attrs);
for (i = 0; i < num_attrs; i ++)
free(attrs[i]);
}
}
/*
* 'ippGetTemplateDir()' - Get the templates directory...
*/
char * /* O - Template directory */
ippGetTemplateDir(void)
{
const char *datadir; /* CUPS_DATADIR env var */
static char templates[1024] = ""; /* Template directory */
if (!templates[0])
{
/*
* Build the template directory pathname...
*/
if ((datadir = getenv("CUPS_DATADIR")) == NULL)
datadir = CUPS_DATADIR;
snprintf(templates, sizeof(templates), "%s/templates", datadir);
}
return (templates);
}
/*
* 'ippRewriteURL()' - Rewrite a printer URI into a web browser URL...
*/
char * /* O - New URL */
ippRewriteURL(const char *uri, /* I - Current URI */
char *url, /* O - New URL */
int urlsize) /* I - Size of URL buffer */
{
char method[HTTP_MAX_URI],
userpass[HTTP_MAX_URI],
hostname[HTTP_MAX_URI],
rawresource[HTTP_MAX_URI],
resource[HTTP_MAX_URI],
/* URI components... */
*rawptr, /* Pointer into rawresource */
*resptr; /* Pointer into resource */
int port; /* Port number */
static int ishttps = -1; /* Using encryption? */
static const char *server; /* Name of server */
static char servername[1024];
/* Local server name */
static const char hexchars[] = "0123456789ABCDEF";
/* Hexadecimal conversion characters */
/*
* Check if we have been called before...
*/
if (ishttps < 0)
{
/*
* No, initialize static vars for the conversion...
*
* First get the server name associated with the client interface as
* well as the locally configured hostname. We'll check *both* of
* these to see if the printer URL is local...
*/
server = getenv("SERVER_NAME");
gethostname(servername, sizeof(servername));
/*
* Then flag whether we are using SSL on this connection...
*/
ishttps = getenv("HTTPS") != NULL;
}
/*
* Convert the URI to a URL...
*/
httpSeparate(uri, method, userpass, hostname, &port, rawresource);
if (strcmp(method, "ipp") == 0 ||
strcmp(method, "http") == 0)
{
/*
* Rewrite the resource string so it doesn't contain any
* illegal chars...
*/
for (rawptr = rawresource, resptr = resource; *rawptr;)
if ((*rawptr & 128) || *rawptr == '%' || *rawptr == ' ' ||
*rawptr == '#' || *rawptr == '?' ||
*rawptr == '.') /* For MSIE */
{
if (resptr < (resource + sizeof(resource) - 3))
{
*resptr++ = '%';
*resptr++ = hexchars[(*rawptr >> 4) & 15];
*resptr++ = hexchars[*rawptr & 15];
}
}
else if (resptr < (resource + sizeof(resource) - 1))
*resptr++ = *rawptr++;
*resptr = '\0';
/*
* Map local access to a local URI...
*/
if (strcasecmp(hostname, server) == 0 ||
strcasecmp(hostname, servername) == 0)
{
/*
* Make URI relative to the current server...
*/
strlcpy(url, resource, urlsize);
}
else
{
/*
* Rewrite URI with HTTP/HTTPS scheme...
*/
if (userpass[0])
snprintf(url, urlsize, "%s://%s@%s:%d%s",
ishttps ? "https" : "http",
userpass, hostname, port, resource);
else
snprintf(url, urlsize, "%s://%s:%d%s",
ishttps ? "https" : "http",
hostname, port, resource);
}
}
else
strlcpy(url, uri, urlsize);
return (url);
}
/*
* 'ippSetServerVersion()' - Set the server name and CUPS version...
*/
void
ippSetServerVersion(void)
{
cgiSetVariable("SERVER_NAME", getenv("SERVER_NAME"));
cgiSetVariable("REMOTE_USER", getenv("REMOTE_USER"));
cgiSetVariable("CUPS_VERSION", CUPS_SVERSION);
#ifdef LC_TIME
setlocale(LC_TIME, "");
#endif /* LC_TIME */
}
/*
* 'ippSetCGIVars()' - Set CGI variables from an IPP response.
*/
void
ippSetCGIVars(ipp_t *response, /* I - Response data to be copied... */
const char *filter_name, /* I - Filter name */
const char *filter_value, /* I - Filter value */
const char *prefix, /* I - Prefix for name or NULL */
int parent_el) /* I - Parent element number */
{
int element; /* Element in CGI array */
ipp_attribute_t *attr, /* Attribute in response... */
*filter; /* Filtering attribute */
int i; /* Looping var */
char name[1024], /* Name of attribute */
*nameptr, /* Pointer into name */
value[16384], /* Value(s) */
*valptr; /* Pointer into value */
struct tm *date; /* Date information */
DEBUG_printf(("<P>ippSetCGIVars(response=%p, filter_name=\"%s\", filter_value=\"%s\", prefix=\"%s\")\n",
response, filter_name, filter_value, prefix));
/*
* Set common CGI template variables...
*/
if (!prefix)
ippSetServerVersion();
/*
* Loop through the attributes and set them for the template...
*/
attr = response->attrs;
if (!prefix)
while (attr && attr->group_tag == IPP_TAG_OPERATION)
attr = attr->next;
for (element = parent_el; attr != NULL; attr = attr->next, element ++)
{
/*
* Copy attributes to a separator...
*/
if (filter_name)
{
for (filter = attr;
filter != NULL && filter->group_tag != IPP_TAG_ZERO;
filter = filter->next)
if (filter->name && strcmp(filter->name, filter_name) == 0 &&
(filter->value_tag == IPP_TAG_STRING ||
(filter->value_tag >= IPP_TAG_TEXTLANG &&
filter->value_tag <= IPP_TAG_MIMETYPE)) &&
filter->values[0].string.text != NULL &&
strcasecmp(filter->values[0].string.text, filter_value) == 0)
break;
if (!filter)
return;
if (filter->group_tag == IPP_TAG_ZERO)
{
attr = filter;
element --;
continue;
}
}
for (; attr != NULL && attr->group_tag != IPP_TAG_ZERO; attr = attr->next)
{
/*
* Copy the attribute name, substituting "_" for "-"...
*/
if (attr->name == NULL)
continue;
if (prefix)
{
snprintf(name, sizeof(name), "%s.", prefix);
nameptr = name + strlen(name);
}
else
nameptr = name;
for (i = 0; attr->name[i] && nameptr < (name + sizeof(name) - 1); i ++)
if (attr->name[i] == '-')
*nameptr++ = '_';
else
*nameptr++ = attr->name[i];
*nameptr = '\0';
/*
* Add "job_printer_name" variable if we have a "job_printer_uri"
* attribute...
*/
if (!strcmp(name, "job_printer_uri"))
{
if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL)
valptr = "unknown";
else
valptr ++;
cgiSetArray("job_printer_name", element, valptr);
}
/*
* Copy values...
*/
value[0] = '\0'; /* Initially an empty string */
valptr = value; /* Start at the beginning */
for (i = 0; i < attr->num_values; i ++)
{
if (i)
strlcat(valptr, ",", sizeof(value) - (valptr - value));
valptr += strlen(valptr);
switch (attr->value_tag)
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
if (strncmp(name, "time_at_", 8) == 0)
{
time_t t; /* Temporary time value */
t = (time_t)attr->values[i].integer;
date = localtime(&t);
strftime(valptr, sizeof(value) - (valptr - value),
CUPS_STRFTIME_FORMAT, date);
}
else
snprintf(valptr, sizeof(value) - (valptr - value),
"%d", attr->values[i].integer);
break;
case IPP_TAG_BOOLEAN :
snprintf(valptr, sizeof(value) - (valptr - value),
"%d", attr->values[i].boolean);
break;
case IPP_TAG_NOVALUE :
strlcat(valptr, "novalue", sizeof(value) - (valptr - value));
break;
case IPP_TAG_RANGE :
snprintf(valptr, sizeof(value) - (valptr - value),
"%d-%d", attr->values[i].range.lower,
attr->values[i].range.upper);
break;
case IPP_TAG_RESOLUTION :
snprintf(valptr, sizeof(value) - (valptr - value),
"%dx%d%s", attr->values[i].resolution.xres,
attr->values[i].resolution.yres,
attr->values[i].resolution.units == IPP_RES_PER_INCH ?
"dpi" : "dpc");
break;
case IPP_TAG_URI :
if (strchr(attr->values[i].string.text, ':') != NULL)
{
/*
* Rewrite URIs...
*/
ippRewriteURL(attr->values[i].string.text, valptr,
sizeof(value) - (valptr - value));
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 :
strlcat(valptr, attr->values[i].string.text,
sizeof(value) - (valptr - value));
break;
case IPP_TAG_BEGIN_COLLECTION :
snprintf(value, sizeof(value), "%s%d", name, i + 1);
ippSetCGIVars(attr->values[i].collection, filter_name,
filter_value, value, element);
break;
default :
break; /* anti-compiler-warning-code */
}
}
/*
* Add the element...
*/
if (attr->value_tag != IPP_TAG_BEGIN_COLLECTION)
{
cgiSetArray(name, element, value);
DEBUG_printf(("<P>%s[%d]=\"%s\"\n", name, element, value));
}
}
if (attr == NULL)
break;
}
DEBUG_puts("<P>Leaving ippSetCGIVars()...");
}
/*
* End of "$Id$".
*/
+58
Ver Arquivo
@@ -0,0 +1,58 @@
/*
* "$Id$"
*
* IPP variable definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
/*
* Include necessary headers...
*/
#include <cups/cups.h>
#include <cups/debug.h>
#include <cups/language.h>
#include <cups/string.h>
#include "cgi.h"
/*
* Definitions...
*/
#define TEMPLATES ippGetTemplateDir()
/*
* Prototype...
*/
extern void ippGetAttributes(ipp_t *request, const char *directory,
const char *tmpl, const char *lang);
extern char *ippGetTemplateDir(void);
extern char *ippRewriteURL(const char *, char *, int);
extern void ippSetServerVersion(void);
extern void ippSetCGIVars(ipp_t *, const char *, const char *,
const char *, int);
/*
* End of "$Id$".
*/
+261
Ver Arquivo
@@ -0,0 +1,261 @@
/*
* "$Id$"
*
* Job status CGI for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* main() - Main entry for CGI.
* do_job_op() - Do a job operation.
*/
/*
* Include necessary headers...
*/
#include "ipp-var.h"
/*
* Local functions...
*/
static void do_job_op(http_t *http, cups_lang_t *language, ipp_op_t op);
/*
* 'main()' - Main entry for CGI.
*/
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 */
http_t *http; /* Connection to the server */
const char *which_jobs; /* Which jobs to show */
ipp_t *request, /* IPP request */
*response; /* IPP response */
const char *op; /* Operation name */
/*
* Get any form variables...
*/
cgiInitialize();
/*
* Get the request language...
*/
language = cupsLangDefault();
/*
* Connect to the HTTP server...
*/
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
/*
* Tell the client to expect HTML...
*/
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
cgiSetVariable("TITLE", "Jobs");
ippSetServerVersion();
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
if ((op = cgiGetVariable("OP")) != NULL)
{
/*
* Do the operation...
*/
if (strcmp(op, "cancel-job") == 0)
do_job_op(http, language, IPP_CANCEL_JOB);
else if (strcmp(op, "hold-job") == 0)
do_job_op(http, language, IPP_HOLD_JOB);
else if (strcmp(op, "release-job") == 0)
do_job_op(http, language, IPP_RELEASE_JOB);
else if (strcmp(op, "restart-job") == 0)
do_job_op(http, language, IPP_RESTART_JOB);
else
{
/*
* Bad operation code... Display an error...
*/
cgiCopyTemplateLang(stdout, TEMPLATES, "job-op.tmpl", getenv("LANG"));
}
}
else
{
/*
* Build an IPP_GET_JOBS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request = ippNew();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
"ipp://localhost/jobs");
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
NULL, which_jobs);
ippGetAttributes(request, TEMPLATES, "jobs.tmpl", getenv("LANG"));
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
}
}
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
/*
* Close the HTTP server connection...
*/
httpClose(http);
cupsLangFree(language);
/*
* Return with no errors...
*/
return (0);
}
/*
* 'do_job_op()' - Do a job operation.
*/
static void
do_job_op(http_t *http, /* I - HTTP connection */
cups_lang_t *language, /* I - Client's language */
ipp_op_t op) /* I - Operation to perform */
{
ipp_t *request, /* IPP request */
*response; /* IPP response */
char uri[HTTP_MAX_URI]; /* Job URI */
const char *job; /* Job ID */
ipp_status_t status; /* Operation status... */
if ((job = cgiGetVariable("JOB_ID")) != NULL)
snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%s", job);
else
{
cgiSetVariable("ERROR", ippErrorString(IPP_NOT_FOUND));
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
return;
}
/*
* Build a job request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* job-uri or printer-uri (purge-jobs)
* requesting-user-name
*/
request = ippNew();
request->request.op.operation_id = op;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri",
NULL, uri);
if (getenv("REMOTE_USER") != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, getenv("REMOTE_USER"));
else
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, "unknown");
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/jobs")) != NULL)
{
status = response->request.status.status_code;
ippDelete(response);
}
else
status = cupsLastError();
if (status > IPP_OK_CONFLICT)
{
cgiSetVariable("ERROR", ippErrorString(status));
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
}
else if (op == IPP_CANCEL_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-cancel.tmpl", getenv("LANG"));
else if (op == IPP_HOLD_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-hold.tmpl", getenv("LANG"));
else if (op == IPP_RELEASE_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-release.tmpl", getenv("LANG"));
else if (op == IPP_RESTART_JOB)
cgiCopyTemplateLang(stdout, TEMPLATES, "job-restart.tmpl", getenv("LANG"));
}
/*
* End of "$Id$".
*/
+264 -369
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Printer status CGI for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -23,46 +23,48 @@
*
* Contents:
*
* main() - Main entry for CGI.
* show_printer_list() - Show a list of printers...
* show_printer_info() - Show printer information.
* main() - Main entry for CGI.
*/
/*
* 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 void show_printer_list(http_t *http, cups_lang_t *language);
static void show_printer_info(http_t *http, cups_lang_t *language,
char *name);
#include "ipp-var.h"
/*
* 'main()' - Main entry for CGI.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
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 *printer; /* Printer name */
http_t *http; /* Connection to the server */
cups_lang_t *language; /* Language information */
char *printer; /* Printer name */
http_t *http; /* Connection to the server */
ipp_t *request, /* IPP request */
*response; /* IPP response */
ipp_attribute_t *attr; /* IPP attribute */
ipp_status_t status; /* Operation status... */
char uri[HTTP_MAX_URI]; /* Printer URI */
const char *which_jobs; /* Which jobs to show */
const char *op; /* Operation to perform, if any */
static const char *def_attrs[] = /* Attributes for default printer */
{
"printer-name",
"printer-uri-supported"
};
setbuf(stdout, NULL);
/*
* Get any form variables...
*/
cgiInitialize();
op = cgiGetVariable("OP");
/*
* Get the request language...
*/
@@ -73,87 +75,266 @@ main(int argc, /* I - Number of command-line arguments */
* Connect to the HTTP server...
*/
http = httpConnect("localhost", ippPort());
http = httpConnectEncrypt("localhost", ippPort(), cupsEncryption());
/*
* Tell the client to expect HTML...
*/
printf("Content-Type: text/html;charset=%s\n\n", cupsLangEncoding(language));
printf("Content-Type: text/html;charset=%s\r\n\r\n",
cupsLangEncoding(language));
/*
* See if we need to show a list of printers or the status of a
* single printer...
*/
ippSetServerVersion();
printer = argv[0];
if (strcmp(printer, "/") == 0 || strcmp(printer, "printers.cgi") == 0)
if (strcmp(printer, "/") == 0 || strstr(printer, "printers.cgi") != NULL)
{
printer = NULL;
/*
* Print the standard header...
*/
puts("<HTML>");
puts("<HEAD>");
if (printer)
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
cgiSetVariable("TITLE", cupsLangString(language, CUPS_MSG_PRINTER));
}
else
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
printer == NULL ? "Printers" : printer, getenv("SERVER_NAME"));
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
puts("<MAP NAME=\"navbar\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,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>");
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>");
cgiSetVariable("TITLE", printer);
printf("<H1>%s on %s</H1>\n", printer == NULL ? "Printers" : printer,
getenv("SERVER_NAME"));
fflush(stdout);
cgiCopyTemplateLang(stdout, TEMPLATES, "header.tmpl", getenv("LANG"));
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>");
if (op == NULL || strcasecmp(op, "print-test-page") != 0)
{
/*
* Get the default destination...
*/
/*
* Show the information...
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_DEFAULT;
request->request.op.request_id = 1;
if (printer == NULL)
show_printer_list(http, language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes",
sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs);
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text);
if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL)
{
char url[HTTP_MAX_URI]; /* New URL */
cgiSetVariable("DEFAULT_URI",
ippRewriteURL(attr->values[0].string.text,
url, sizeof(url)));
}
ippDelete(response);
}
/*
* Get the printer info...
*/
request = ippNew();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
if (printer == NULL)
{
/*
* Build a CUPS_GET_PRINTERS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
*/
request->request.op.operation_id = CUPS_GET_PRINTERS;
request->request.op.request_id = 1;
}
else
{
/*
* Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
request->request.op.request_id = 1;
snprintf(uri, sizeof(uri), "ipp://%s/printers/%s", getenv("SERVER_NAME"),
printer);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
}
ippGetAttributes(request, TEMPLATES, "printers.tmpl", getenv("LANG"));
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
}
else if (printer)
fprintf(stderr, "ERROR: Get-Printer-Attributes request failed - %s (%x)\n",
ippErrorString(cupsLastError()), cupsLastError());
else
fprintf(stderr, "ERROR: CUPS-Get-Printers request failed - %s (%x)\n",
ippErrorString(cupsLastError()), cupsLastError());
/*
* Write the report...
*/
cgiCopyTemplateLang(stdout, TEMPLATES, "printers.tmpl", getenv("LANG"));
/*
* Get jobs for the specified printer if a printer has been chosen...
*/
if (printer != NULL)
{
/*
* Build an IPP_GET_JOBS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request = ippNew();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 1;
snprintf(uri, sizeof(uri), "ipp://%s/printers/%s", getenv("SERVER_NAME"),
printer);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
uri);
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
NULL, which_jobs);
ippGetAttributes(request, TEMPLATES, "jobs.tmpl", getenv("LANG"));
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
cgiCopyTemplateLang(stdout, TEMPLATES, "jobs.tmpl", getenv("LANG"));
}
else
fprintf(stderr, "ERROR: Get-Jobs request failed - %s (%x)\n",
ippErrorString(cupsLastError()), cupsLastError());
}
}
else
show_printer_info(http, language, printer);
{
/*
* Print a test page...
*/
/*
* Write a standard trailer...
*/
snprintf(uri, sizeof(uri), "ipp://localhost/printers/%s", printer);
puts("</TABLE>");
puts("</CENTER>");
/*
* Build an IPP_PRINT_JOB request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
* requesting-user-name
* document-format
*/
puts("<HR>");
request = ippNew();
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.");
request->request.op.operation_id = IPP_PRINT_JOB;
request->request.op.request_id = 1;
puts("</BODY>");
puts("</HTML>");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
if (getenv("REMOTE_USER") != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, getenv("REMOTE_USER"));
else
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, "root");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
NULL, "Test Page");
ippAddString(request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format",
NULL, "application/postscript");
/*
* Do the request and get back a response...
*/
if ((response = cupsDoFileRequest(http, request, uri + 15,
CUPS_DATADIR "/data/testprint.ps")) != NULL)
{
status = response->request.status.status_code;
ippSetCGIVars(response, NULL, NULL, NULL, 0);
ippDelete(response);
}
else
status = cupsLastError();
cgiSetVariable("PRINTER_NAME", printer);
if (status > IPP_OK_CONFLICT)
{
cgiSetVariable("ERROR", ippErrorString(status));
cgiCopyTemplateLang(stdout, TEMPLATES, "error.tmpl", getenv("LANG"));
}
else
cgiCopyTemplateLang(stdout, TEMPLATES, "test-page.tmpl", getenv("LANG"));
}
cgiCopyTemplateLang(stdout, TEMPLATES, "trailer.tmpl", getenv("LANG"));
/*
* Close the HTTP server connection...
@@ -170,292 +351,6 @@ main(int argc, /* I - Number of command-line arguments */
}
/*
* 'show_printer_list()' - Show a list of printers...
*/
static void
show_printer_list(http_t *http, /* I - HTTP connection */
cups_lang_t *language)/* I - Client's language */
{
ipp_t *request, /* IPP request */
*response; /* IPP response */
ipp_attribute_t *attr; /* IPP attribute */
/*
* Build a CUPS_GET_PRINTERS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_PRINTERS;
request->request.op.request_id = 1;
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);
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/printers/")) != NULL)
{
/*
* Loop through the printers returned in the list and display
* their devices...
*/
for (attr = response->attrs; attr != NULL; attr = attr->next)
{
/*
* Skip leading attributes until we hit a job...
*/
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
attr = attr->next;
if (attr == NULL)
break;
/*
* Show the printer status for each printer...
*/
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
{
if (strcmp(attr->name, "printer-name") == 0 &&
attr->value_tag == IPP_TAG_NAME)
show_printer_info(http, language, attr->values[0].string.text);
attr = attr->next;
}
if (attr == NULL)
break;
}
ippDelete(response);
}
}
/*
* 'show_printer_info()' - Show printer information.
*/
static void
show_printer_info(http_t *http,
cups_lang_t *language,
char *name)
{
ipp_t *request, /* IPP request */
*response, /* IPP response */
*jobs; /* IPP Get Jobs response */
int jobcount; /* Number of jobs */
ipp_attribute_t *attr; /* IPP attribute */
char *message; /* Printer state message */
int accepting; /* Accepting requests? */
ipp_pstate_t pstate; /* Printer state */
char uri[1024]; /* Printer URI */
/*
* Build a IPP_GET_PRINTER_ATTRIBUTES request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request = ippNew();
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
request->request.op.request_id = 1;
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
sprintf(uri, "ipp://localhost/printers/%s", name);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, uri + 15)) != NULL)
{
/*
* 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;
/*
* Display the printer entry...
*/
puts("<TR>");
printf("<TD VALIGN=TOP><A HREF=\"/printers/%s\">%s</A></TD>\n", name, name);
printf("<TD VALIGN=TOP><IMG SRC=\"/images/printer-%s.gif\" ALIGN=\"LEFT\">\n",
pstate == IPP_PRINTER_IDLE ? "idle" :
pstate == IPP_PRINTER_PROCESSING ? "processing" : "stopped");
printf("%s: %s, %s<BR>\n",
cupsLangString(language, CUPS_MSG_PRINTER_STATE),
cupsLangString(language, pstate == IPP_PRINTER_IDLE ? CUPS_MSG_IDLE :
pstate == IPP_PRINTER_PROCESSING ?
CUPS_MSG_PROCESSING : CUPS_MSG_STOPPED),
cupsLangString(language, accepting ? CUPS_MSG_ACCEPTING_JOBS :
CUPS_MSG_NOT_ACCEPTING_JOBS));
if (message)
printf("<BR CLEAR=ALL><I>\"%s\"</I>\n", message);
else if (!accepting || pstate == IPP_PRINTER_STOPPED)
puts("<BR CLEAR=ALL><I>\"Reason Unknown\"</I>");
puts("</TD>");
/*
* Show a list of jobs as needed...
*/
if (pstate != IPP_PRINTER_IDLE)
{
/*
* Build an IPP_GET_JOBS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
*/
request = ippNew();
request->request.op.operation_id = IPP_GET_JOBS;
request->request.op.request_id = 1;
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)
{
if (strcmp(attr->name, "job-id") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
jobid = attr->values[0].integer;
if (strcmp(attr->name, "job-k-octets") == 0 &&
attr->value_tag == IPP_TAG_INTEGER)
size = attr->values[0].integer;
if (strcmp(attr->name, "job-originating-user-name") == 0 &&
attr->value_tag == IPP_TAG_NAME)
username = attr->values[0].string.text;
attr = attr->next;
}
/*
* Display the job if it matches the current printer...
*/
if (username != NULL)
{
jobcount ++;
printf("<A HREF=\"/jobs/%d\">%s-%d %s %dk</A><BR>\n", jobid, name,
jobid, username, size);
}
if (attr == NULL)
break;
}
ippDelete(jobs);
}
if (jobcount == 0)
puts("None");
puts("</TD>");
puts("</TR>");
ippDelete(response);
}
}
/*
* End of "$Id$".
*/
+492
Ver Arquivo
@@ -0,0 +1,492 @@
/*
* "$Id$"
*
* CGI template function.
*
* Copyright 1997-2003 by Easy Software Products.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Contents:
*
* cgiCopyTemplateFile() - Copy a template file and replace all the
* '{variable}' strings with the variable value.
* cgiCopyTemplateLang() - Copy a template file using a language...
* cgi_copy() - Copy the template file, substituting as needed...
* cgi_puts() - Put a string to the output file, quoting as
* needed...
*/
#include "cgi.h"
/*
* Local functions...
*/
static void cgi_copy(FILE *out, FILE *in, int element, char term);
static void cgi_puts(const char *s, FILE *out);
/*
* 'cgiCopyTemplateFile()' - Copy a template file and replace all the
* '{variable}' strings with the variable value.
*/
void
cgiCopyTemplateFile(FILE *out, /* I - Output file */
const char *tmpl) /* I - Template file to read */
{
FILE *in; /* Input file */
/*
* Open the template file...
*/
if ((in = fopen(tmpl, "r")) == NULL)
return;
/*
* Parse the file to the end...
*/
cgi_copy(out, in, 0, 0);
/*
* Close the template file and return...
*/
fclose(in);
}
/*
* 'cgiCopyTemplateLang()' - Copy a template file using a language...
*/
void
cgiCopyTemplateLang(FILE *out, /* I - Output file */
const char *directory, /* I - Directory */
const char *tmpl, /* I - Base filename */
const char *lang) /* I - Language */
{
int i; /* Looping var */
char filename[1024], /* Filename */
locale[16]; /* Locale name */
FILE *in; /* Input file */
/*
* Convert the language to a locale name...
*/
if (lang != NULL)
{
for (i = 0; lang[i] && i < 15; i ++)
if (isalnum(lang[i]))
locale[i] = tolower(lang[i]);
else
locale[i] = '_';
locale[i] = '\0';
}
else
locale[0] = '\0';
/*
* See if we have a template file for this language...
*/
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
if (access(filename, 0))
{
locale[2] = '\0';
snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl);
if (access(filename, 0))
snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl);
}
/*
* Open the template file...
*/
if ((in = fopen(filename, "r")) == NULL)
return;
/*
* Parse the file to the end...
*/
cgi_copy(out, in, 0, 0);
/*
* Close the template file and return...
*/
fclose(in);
}
/*
* 'cgi_copy()' - Copy the template file, substituting as needed...
*/
static void
cgi_copy(FILE *out, /* I - Output file */
FILE *in, /* I - Input file */
int element, /* I - Element number (0 to N) */
char term) /* I - Terminating character */
{
int ch; /* Character from file */
char op; /* Operation */
char name[255], /* Name of variable */
*nameptr, /* Pointer into name */
innername[255], /* Inner comparison name */
*innerptr, /* Pointer into inner name */
*s; /* String pointer */
const char *value; /* Value of variable */
const char *innerval; /* Inner value */
const char *outptr; /* Output string pointer */
char outval[1024], /* Formatted output string */
compare[1024]; /* Comparison string */
int result; /* Result of comparison */
/*
* Parse the file to the end...
*/
while ((ch = getc(in)) != EOF)
if (ch == term)
break;
else if (ch == '{')
{
/*
* Get a variable name...
*/
for (s = name; (ch = getc(in)) != EOF;)
if (strchr("}]<>=! \t\n", ch))
break;
else if (s > name && ch == '?')
break;
else if (s < (name + sizeof(name) - 1))
*s++ = ch;
*s = '\0';
if (s == name && isspace(ch))
{
if (out)
{
putc('{', out);
putc(ch, out);
}
continue;
}
/*
* See if it has a value...
*/
if (name[0] == '?')
{
/*
* Insert value only if it exists...
*/
if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1]))
{
*nameptr++ = '\0';
if ((value = cgiGetArray(name + 1, atoi(nameptr) - 1)) != NULL)
outptr = value;
else
{
outval[0] = '\0';
outptr = outval;
}
}
else if ((value = cgiGetArray(name + 1, element)) != NULL)
outptr = value;
else
{
outval[0] = '\0';
outptr = outval;
}
}
else if (name[0] == '#')
{
/*
* Insert count...
*/
if (name[1])
sprintf(outval, "%d", cgiGetSize(name + 1));
else
sprintf(outval, "%d", element + 1);
outptr = outval;
}
else if (name[0] == '[')
{
/*
* Loop for # of elements...
*/
int i; /* Looping var */
long pos; /* File position */
int count; /* Number of elements */
if (isdigit(name[1]))
count = atoi(name + 1);
else
count = cgiGetSize(name + 1);
pos = ftell(in);
if (count > 0)
{
for (i = 0; i < count; i ++)
{
fseek(in, pos, SEEK_SET);
cgi_copy(out, in, i, '}');
}
}
else
cgi_copy(NULL, in, 0, '}');
continue;
}
else
{
/*
* Insert variable or variable name (if element is NULL)...
*/
if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1]))
{
*nameptr++ = '\0';
if ((value = cgiGetArray(name, atoi(nameptr) - 1)) == NULL)
{
snprintf(outval, sizeof(outval), "{%s}", name);
outptr = outval;
}
else
outptr = value;
}
else if ((value = cgiGetArray(name, element)) == NULL)
{
snprintf(outval, sizeof(outval), "{%s}", name);
outptr = outval;
}
else
outptr = value;
}
/*
* See if the terminating character requires another test...
*/
if (ch == '}')
{
/*
* End of substitution...
*/
if (out)
cgi_puts(outptr, out);
continue;
}
/*
* OK, process one of the following checks:
*
* {name?exist:not-exist} Exists?
* {name=value?true:false} Equal
* {name<value?true:false} Less than
* {name>value?true:false} Greater than
* {name!value?true:false} Not equal
*/
if (ch == '?')
{
/*
* Test for existance...
*/
result = cgiGetArray(name, element) != NULL && outptr[0];
}
else
{
/*
* Compare to a string...
*/
op = ch;
for (s = compare; (ch = getc(in)) != EOF;)
if (ch == '?')
break;
else if (s >= (compare + sizeof(compare) - 1))
continue;
else if (ch == '#')
{
sprintf(s, "%d", element + 1);
s += strlen(s);
}
else if (ch == '{')
{
/*
* Grab the value of a variable...
*/
innerptr = innername;
while ((ch = getc(in)) != EOF && ch != '}')
if (innerptr < (innername + sizeof(innername) - 1))
*innerptr++ = ch;
*innerptr = '\0';
if (innername[0] == '#')
sprintf(s, "%d", cgiGetSize(innername + 1));
else if ((innerptr = strrchr(innername, '-')) != NULL &&
isdigit(innerptr[1]))
{
*innerptr++ = '\0';
if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL)
*s = '\0';
else
strlcpy(s, innerval, sizeof(compare) - (s - compare));
}
else if (innername[0] == '?')
{
if ((innerval = cgiGetArray(innername + 1, element)) == NULL)
*s = '\0';
else
strlcpy(s, innerval, sizeof(compare) - (s - compare));
}
else if ((innerval = cgiGetArray(innername, element)) == NULL)
snprintf(s, sizeof(s), "{%s}", innername);
else
strlcpy(s, innerval, sizeof(compare) - (s - compare));
s += strlen(s);
}
else if (ch == '\\')
*s++ = getc(in);
else
*s++ = ch;
*s = '\0';
if (ch != '?')
return;
/*
* Do the comparison...
*/
switch (op)
{
case '<' :
result = strcasecmp(outptr, compare) < 0;
break;
case '>' :
result = strcasecmp(outptr, compare) > 0;
break;
case '=' :
result = strcasecmp(outptr, compare) == 0;
break;
case '!' :
result = strcasecmp(outptr, compare) != 0;
break;
default :
result = 1;
break;
}
}
if (result)
{
/*
* Comparison true; output first part and ignore second...
*/
cgi_copy(out, in, element, ':');
cgi_copy(NULL, in, element, '}');
}
else
{
/*
* Comparison false; ignore first part and output second...
*/
cgi_copy(NULL, in, element, ':');
cgi_copy(out, in, element, '}');
}
}
else if (ch == '\\') /* Quoted char */
{
if (out)
putc(getc(in), out);
else
getc(in);
}
else if (out)
putc(ch, out);
/*
* Flush any pending output...
*/
if (out)
fflush(out);
}
/*
* 'cgi_puts()' - Put a string to the output file, quoting as needed...
*/
static void
cgi_puts(const char *s,
FILE *out)
{
while (*s)
{
if (s[0] == '<')
fputs("&lt;", out);
else if (s[0] == '>')
fputs("&gt;", out);
else if (*s == '\"')
fputs("&quot;", out);
else if (s[0] == '&')
fputs("&amp;", out);
else
putc(*s, out);
s ++;
}
}
/*
* End of "$Id$".
*/
+672
Ver Arquivo
@@ -0,0 +1,672 @@
/*
* "$Id$"
*
* CGI form variable and array functions.
*
* Copyright 1997-2003 by Easy Software Products.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Contents:
*
* cgiInitialize() - Initialize the CGI variable "database"...
* cgiCheckVariables() - Check for the presence of "required" variables.
* cgiGetArray() - Get an element from a form array...
* cgiGetSize() - Get the size of a form array value.
* cgiGetVariable() - Get a CGI variable from the database...
* cgiSetArray() - Set array element N to the specified string.
* cgiSetVariable() - Set a CGI variable in the database...
* cgi_add_variable() - Add a form variable.
* cgi_compare_variables() - Compare two variables.
* cgi_find_variable() - Find a variable...
* cgi_initialize_get() - Initialize form variables using the GET method.
* cgi_initialize_post() - Initialize variables using the POST method.
* cgi_initialize_string() - Initialize form variables from a string.
* cgi_sort_variables() - Sort all form variables for faster lookup.
*/
/*#define DEBUG*/
#include "cgi.h"
#include <errno.h>
#include <syslog.h>
/*
* Data structure to hold all the CGI form variables and arrays...
*/
typedef struct
{
const char *name; /* Name of variable */
int nvalues, /* Number of values */
avalues; /* Number of values allocated */
const char **values; /* Value(s) of variable */
} var_t;
/*
* Local globals...
*/
static int form_count = 0, /* Form variable count */
form_alloc = 0; /* Number of variables allocated */
static var_t *form_vars = NULL; /* Form variables */
/*
* Local functions...
*/
static void cgi_add_variable(const char *name, int element,
const char *value);
static int cgi_compare_variables(const var_t *v1, const var_t *v2);
static var_t *cgi_find_variable(const char *name);
static int cgi_initialize_get(void);
static int cgi_initialize_post(void);
static int cgi_initialize_string(const char *data);
static void cgi_sort_variables(void);
/*
* 'cgiInitialize()' - Initialize the CGI variable "database"...
*/
int /* O - Non-zero if there was form data */
cgiInitialize(void)
{
char *method; /* Form posting method */
#ifdef DEBUG
setbuf(stdout, NULL);
puts("Content-type: text/plain\n");
#endif /* DEBUG */
method = getenv("REQUEST_METHOD");
if (method == NULL)
return (0);
if (strcasecmp(method, "GET") == 0)
return (cgi_initialize_get());
else if (strcasecmp(method, "POST") == 0)
return (cgi_initialize_post());
else
return (0);
}
/*
* 'cgiCheckVariables()' - Check for the presence of "required" variables.
*
* Names may be separated by spaces and/or commas.
*/
int /* O - 1 if all variables present, 0 otherwise */
cgiCheckVariables(const char *names) /* I - Variables to look for */
{
char name[255], /* Current variable name */
*s; /* Pointer in string */
const char *val; /* Value of variable */
int element; /* Array element number */
if (names == NULL)
return (1);
while (*names != '\0')
{
while (*names == ' ' || *names == ',')
names ++;
for (s = name; *names != '\0' && *names != ' ' && *names != ','; s ++, names ++)
*s = *names;
*s = 0;
if (name[0] == '\0')
break;
if ((s = strrchr(name, '-')) != NULL)
{
*s = '\0';
element = atoi(s + 1) - 1;
val = cgiGetArray(name, element);
}
else
val = cgiGetVariable(name);
if (val == NULL)
return (0);
if (*val == '\0')
return (0); /* Can't be blank, either! */
}
return (1);
}
/*
* 'cgiGetArray()' - Get an element from a form array...
*/
const char * /* O - Element value or NULL */
cgiGetArray(const char *name, /* I - Name of array variable */
int element) /* I - Element number (0 to N) */
{
var_t *var; /* Pointer to variable */
if ((var = cgi_find_variable(name)) == NULL)
return (NULL);
if (var->nvalues == 1)
return (var->values[0]);
if (element < 0 || element >= var->nvalues)
return (NULL);
return (var->values[element]);
}
/*
* 'cgiGetSize()' - Get the size of a form array value.
*/
int /* O - Number of elements */
cgiGetSize(const char *name) /* I - Name of variable */
{
var_t *var; /* Pointer to variable */
if ((var = cgi_find_variable(name)) == NULL)
return (0);
return (var->nvalues);
}
/*
* 'cgiGetVariable()' - Get a CGI variable from the database...
*
* Returns NULL if the variable doesn't exist... If the variable is an
* array of values, returns the last element...
*/
const char * /* O - Value of variable */
cgiGetVariable(const char *name)/* I - Name of variable */
{
const var_t *var; /* Returned variable */
var = cgi_find_variable(name);
#ifdef DEBUG
if (var == NULL)
printf("cgiGetVariable(\"%s\") is returning NULL...\n", name);
else
printf("cgiGetVariable(\"%s\") is returning \"%s\"...\n", name,
var->values[var->nvalues - 1]);
#endif /* DEBUG */
return ((var == NULL) ? NULL : var->values[var->nvalues - 1]);
}
/*
* 'cgiSetArray()' - Set array element N to the specified string.
*
* If the variable array is smaller than (element + 1), the intervening
* elements are set to NULL.
*/
void
cgiSetArray(const char *name, /* I - Name of variable */
int element, /* I - Element number (0 to N) */
const char *value) /* I - Value of variable */
{
int i; /* Looping var */
var_t *var; /* Returned variable */
if (name == NULL || value == NULL || element < 0 || element > 100000)
return;
if ((var = cgi_find_variable(name)) == NULL)
{
cgi_add_variable(name, element, value);
cgi_sort_variables();
}
else
{
if (element >= var->avalues)
{
var->avalues = element + 16;
var->values = (const char **)realloc((void *)(var->values),
sizeof(char *) * var->avalues);
}
if (element >= var->nvalues)
{
for (i = var->nvalues; i < element; i ++)
var->values[i] = NULL;
var->nvalues = element + 1;
}
else if (var->values[element])
free((char *)var->values[element]);
var->values[element] = strdup(value);
}
}
/*
* 'cgiSetSize()' - Set the array size.
*/
void
cgiSetSize(const char *name, /* I - Name of variable */
int size) /* I - Number of elements (0 to N) */
{
int i; /* Looping var */
var_t *var; /* Returned variable */
if (name == NULL || size < 0 || size > 100000)
return;
if ((var = cgi_find_variable(name)) == NULL)
return;
if (size >= var->avalues)
{
var->avalues = size + 16;
var->values = (const char **)realloc((void *)(var->values),
sizeof(char *) * var->avalues);
}
if (size > var->nvalues)
{
for (i = var->nvalues; i < size; i ++)
var->values[i] = NULL;
}
else if (size < var->nvalues)
{
for (i = size; i < var->nvalues; i ++)
if (var->values[i])
free((void *)(var->values[i]));
}
var->nvalues = size;
}
/*
* 'cgiSetVariable()' - Set a CGI variable in the database...
*
* If the variable is an array, this truncates the array to a single element.
*/
void
cgiSetVariable(const char *name, /* I - Name of variable */
const char *value) /* I - Value of variable */
{
int i; /* Looping var */
var_t *var; /* Returned variable */
if (name == NULL || value == NULL)
return;
if ((var = cgi_find_variable(name)) == NULL)
{
cgi_add_variable(name, 0, value);
cgi_sort_variables();
}
else
{
for (i = 0; i < var->nvalues; i ++)
if (var->values[i])
free((char *)var->values[i]);
var->values[0] = strdup(value);
var->nvalues = 1;
}
}
/*
* 'cgi_add_variable()' - Add a form variable.
*/
static void
cgi_add_variable(const char *name, /* I - Variable name */
int element, /* I - Array element number */
const char *value) /* I - Variable value */
{
var_t *var; /* New variable */
if (name == NULL || value == NULL || element < 0 || element > 100000)
return;
#ifdef DEBUG
printf("Adding variable \'%s\' with value \'%s\'...\n", name, value);
#endif /* DEBUG */
if (form_count >= form_alloc)
{
if (form_alloc == 0)
form_vars = malloc(sizeof(var_t) * 16);
else
form_vars = realloc(form_vars, (form_alloc + 16) * sizeof(var_t));
form_alloc += 16;
}
var = form_vars + form_count;
var->name = strdup(name);
var->nvalues = element + 1;
var->avalues = element + 1;
var->values = calloc(element + 1, sizeof(char *));
var->values[element] = strdup(value);
form_count ++;
}
/*
* 'cgi_compare_variables()' - Compare two variables.
*/
static int /* O - Result of comparison */
cgi_compare_variables(const var_t *v1, /* I - First variable */
const var_t *v2) /* I - Second variable */
{
return (strcasecmp(v1->name, v2->name));
}
/*
* 'cgi_find_variable()' - Find a variable...
*/
static var_t * /* O - Variable pointer or NULL */
cgi_find_variable(const char *name) /* I - Name of variable */
{
var_t key; /* Search key */
if (form_count < 1 || name == NULL)
return (NULL);
key.name = name;
return ((var_t *)bsearch(&key, form_vars, form_count, sizeof(var_t),
(int (*)(const void *, const void *))cgi_compare_variables));
}
/*
* 'cgi_initialize_get()' - Initialize form variables using the GET method.
*/
static int /* O - 1 if form data read */
cgi_initialize_get(void)
{
char *data; /* Pointer to form data string */
#ifdef DEBUG
puts("Initializing variables using GET method...");
#endif /* DEBUG */
/*
* Check to see if there is anything for us to read...
*/
data = getenv("QUERY_STRING");
if (data == NULL || strlen(data) == 0)
return (0);
/*
* Parse it out and return...
*/
return (cgi_initialize_string(data));
}
/*
* 'cgi_initialize_post()' - Initialize variables using the POST method.
*/
static int /* O - 1 if form data was read */
cgi_initialize_post(void)
{
char *content_length, /* Length of input data (string) */
*data; /* Pointer to form data string */
int length, /* Length of input data */
nbytes, /* Number of bytes read this read() */
tbytes, /* Total number of bytes read */
status; /* Return status */
#ifdef DEBUG
puts("Initializing variables using POST method...");
#endif /* DEBUG */
/*
* Check to see if there is anything for us to read...
*/
content_length = getenv("CONTENT_LENGTH");
if (content_length == NULL || atoi(content_length) <= 0)
return (0);
/*
* Get the length of the input stream and allocate a buffer for it...
*/
length = atoi(content_length);
data = malloc(length + 1);
if (data == NULL)
return (0);
/*
* Read the data into the buffer...
*/
for (tbytes = 0; tbytes < length; tbytes += nbytes)
if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0)
if (errno != EAGAIN)
{
free(data);
return (0);
}
data[length] = '\0';
/*
* Parse it out...
*/
status = cgi_initialize_string(data);
/*
* Free the data and return...
*/
free(data);
return (status);
}
/*
* 'cgi_initialize_string()' - Initialize form variables from a string.
*/
static int
cgi_initialize_string(const char *data) /* I - Form data string */
{
int done; /* True if we're done reading a form variable */
char *s, /* Pointer to current form string */
ch, /* Temporary character */
name[255], /* Name of form variable */
value[65536]; /* Variable value... */
/*
* Check input...
*/
if (data == NULL)
return (0);
/*
* Loop until we've read all the form data...
*/
while (*data != '\0')
{
/*
* Get the variable name...
*/
for (s = name; *data != '\0'; data ++)
if (*data == '=')
break;
else if (*data >= ' ' && s < (name + sizeof(name) - 1))
*s++ = *data;
*s = '\0';
if (*data == '=')
data ++;
else
return (0);
/*
* Read the variable value...
*/
for (s = value, done = 0; !done && *data != '\0'; data ++)
switch (*data)
{
case '&' : /* End of data... */
done = 1;
break;
case '+' : /* Escaped space character */
if (s < (value + sizeof(value) - 1))
*s++ = ' ';
break;
case '%' : /* Escaped control character */
/*
* Read the hex code...
*/
if (s < (value + sizeof(value) - 1))
{
data ++;
ch = *data - '0';
if (ch > 9)
ch -= 7;
*s = ch << 4;
data ++;
ch = *data - '0';
if (ch > 9)
ch -= 7;
*s++ |= ch;
}
else
data += 2;
break;
default : /* Other characters come straight through */
if (*data >= ' ' && s < (value + sizeof(value) - 1))
*s++ = *data;
break;
}
*s = '\0'; /* nul terminate the string */
/*
* Remove trailing whitespace...
*/
if (s > value)
s --;
while (s >= value && *s == ' ')
*s-- = '\0';
/*
* Add the string to the variable "database"...
*/
if ((s = strrchr(name, '-')) != NULL && isdigit(s[1]))
{
*s++ = '\0';
if (value[0])
cgiSetArray(name, atoi(s) - 1, value);
}
else if (cgiGetVariable(name) != NULL)
cgiSetArray(name, cgiGetSize(name), value);
else
cgiSetVariable(name, value);
}
return (1);
}
/*
* 'cgi_sort_variables()' - Sort all form variables for faster lookup.
*/
static void
cgi_sort_variables(void)
{
#ifdef DEBUG
int i;
puts("Sorting variables...");
#endif /* DEBUG */
if (form_count < 2)
return;
qsort(form_vars, form_count, sizeof(var_t),
(int (*)(const void *, const void *))cgi_compare_variables);
#ifdef DEBUG
puts("Sorted variable list is:");
for (i = 0; i < form_count; i ++)
printf("%d: %s (%d) = \"%s\" ...\n", i, form_vars[i].name,
form_vars[i].nvalues, form_vars[i].values[0]);
#endif /* DEBUG */
}
/*
* End of "$Id$".
*/
+2
Ver Arquivo
@@ -0,0 +1,2 @@
cupsd.conf
pam.conf
+22 -7
Ver Arquivo
@@ -3,7 +3,7 @@
#
# Configuration file makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1993-1999 by Easy Software Products.
# Copyright 1993-2003 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -28,7 +28,9 @@ include ../Makedefs
# Config files...
#
FILES = classes.conf cupsd.conf mime.convs mime.types printers.conf
KEEP = classes.conf client.conf cupsd.conf printers.conf
REPLACE = mime.convs mime.types
#
# Make everything...
@@ -36,25 +38,38 @@ FILES = classes.conf cupsd.conf mime.convs mime.types printers.conf
all:
#
# Clean all config and object files...
#
clean:
#
# Install files...
#
install:
-$(MKDIR) $(SERVERROOT)/conf
for file in $(FILES); do \
if test -e $(SERVERROOT)/conf/$$file ; then \
$(CP) $$file $(SERVERROOT)/conf/$$file.N ; \
$(INSTALL_DIR) $(SERVERROOT)
for file in $(KEEP); do \
if test -r $(SERVERROOT)/$$file ; then \
$(INSTALL_DATA) $$file $(SERVERROOT)/$$file.N ; \
else \
$(CP) $$file $(SERVERROOT)/conf ; \
$(INSTALL_DATA) $$file $(SERVERROOT) ; \
fi ; \
done
for file in $(REPLACE); do \
if test -r $(SERVERROOT)/$$file ; then \
$(MV) $(SERVERROOT)/$$file $(SERVERROOT)/$$file.O ; \
fi ; \
$(INSTALL_DATA) $$file $(SERVERROOT) ; \
done
-if test x$(PAMDIR) != x$(BUILDROOT); then \
$(INSTALL_DIR) $(PAMDIR); \
$(INSTALL_DATA) pam.conf $(PAMDIR)/cups; \
fi
#
# End of "$Id$".
+27 -10
Ver Arquivo
@@ -1,10 +1,10 @@
#
# "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $"
# "$Id: classes.conf 3041 2002-12-17 19:00:27Z swdev $"
#
# Sample class configuration file for the Common UNIX Printing System
# (CUPS) scheduler.
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -15,7 +15,7 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
@@ -47,18 +47,35 @@
#Info Acme LaserPrint 1000 Printers
#
# MoreInfo: a URL for more information on the printer.
#
#MoreInfo http://www.acme.com/lp1000.html
#
# Location: the location of the printer.
#
#Location Room 101 in the activities building
#
# State: sets the initial state of the class. Can be one of the
# following:
#
# Idle - Class is available to print new jobs.
# Stopped - Class is disabled but accepting new jobs.
#
#State Idle
#
# StateMessage: sets the printer-state-message attribute for the class.
#
#StateMessage Class is idle.
#
# Accepting: is the class accepting jobs?
#
#Accepting Yes
#Accepting No
#
#
# Printer: adds a printer to the class.
#
@@ -68,5 +85,5 @@
#</Class>
#
# End of "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $".
# End of "$Id: classes.conf 3041 2002-12-17 19:00:27Z swdev $".
#
+67
Ver Arquivo
@@ -0,0 +1,67 @@
#
# "$Id: client.conf 3705 2003-05-09 19:14:44Z mike $"
#
# Sample client configuration file for the Common UNIX Printing System
# (CUPS).
#
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
########################################################################
# #
# This is the CUPS client configuration file. This file is used to #
# define client-specific parameters, such as the default server or #
# default encryption settings. #
# #
########################################################################
#
# ServerName: the hostname of your server. By default CUPS will use the
# hostname of the system or the value of the CUPS_SERVER environment
# variable. ONLY ONE SERVER NAME MAY BE SPECIFIED AT A TIME. To use
# more than one server you must use a local scheduler with browsing
# and possibly polling.
#
#ServerName myhost.domain.com
#
# Encryption: whether or not to use encryption; this depends on having
# the OpenSSL library linked into the CUPS library.
#
# Possible values:
#
# Always - Always use encryption (SSL)
# Never - Never use encryption
# Required - Use TLS encryption upgrade
# IfRequested - Use encryption if the server requests it
#
# The default value is "IfRequested". This parameter can also be set
# using the CUPS_ENCRYPTION environment variable.
#
#Encryption Always
#Encryption Never
#Encryption Required
#Encryption IfRequested
#
# End of "$Id: client.conf 3705 2003-05-09 19:14:44Z mike $".
#
-332
Ver Arquivo
@@ -1,332 +0,0 @@
#
# "$Id: cupsd.conf 349 1999-05-21 20:53:02Z mike $"
#
# Sample configuration file for the Common UNIX Printing System (CUPS)
# scheduler.
#
# 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
# 44145 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
########################################################################
# #
# This is the CUPS configuration file. If you are familiar with #
# Apache or any of the other popular web servers, we've followed the #
# same format. Any configuration variable used here has the same #
# semantics as the corresponding variable in Apache. If we need #
# different functionality then a different name is used to avoid #
# confusion... #
# #
########################################################################
#
# Ports/addresses that we listen to. The default port 631 is reserved
# for the Internet Printing Protocol (IPP) and is what we use here.
#
# You can have multiple Port/Listen lines to listen to more than one
# port or address, or to restrict access:
#
# Port 80
# Port 631
# Listen hostname
# Listen hostname:80
# Listen hostname:631
# Listen 1.2.3.4
# Listen 1.2.3.4:631
#
#Port 80
Port 631
#
# User/Group: the user and group the server runs under. Normally this
# must be lp and sys, however you can configure things for another user
# or group as needed.
#
# Note: the server must be run initially as root to support the
# default IPP port of 631. It changes users whenever an external
# program is run...
#
User lp
Group sys
#
# SystemGroup: the group name for "System" (printer administration)
# access.
#
SystemGroup sys
#
# ServerName: the hostname of your server, as advertised to the world.
# By default CUPS will use the hostname of the system.
#
#ServerName myhost.domain.com
#
# ServerAdmin: the email address to send all complaints/problems to.
# By default CUPS will use "root@hostname".
#
#ServerAdmin root@your.domain.com
#
# ServerRoot: the root directory for the scheduler.
# By default the compiled-in value.
#
#ServerRoot /var/cups
#
# AccessLog: the access log file; if this does not start with a leading /
# then it is assumed to be relative to ServerRoot. By default set to
# "logs/access_log"
#
#AccessLog logs/access_log
#
# ErrorLog: the error log file; if this does not start with a leading /
# then it is assumed to be relative to ServerRoot. By default set to
# "logs/error_log"
#
#ErrorLog logs/error_log
#
# PageLog: the page log file; if this does not start with a leading /
# then it is assumed to be relative to ServerRoot. By default set to
# "logs/page_log"
#
#PageLog logs/page_log
#
# LogLevel: controls the number of messages logged to the ErrorLog
# file and can be one of the following:
#
# debug Log everything.
# info Log all requests and state changes.
# warn Log errors and warnings.
# error Log only errors.
# none Log nothing.
#
LogLevel info
#
# MaxLogSize: controls the maximum size of each log file before they are
# rotated. Defaults to 1048576 (1MB). Set to 0 to disable log rotating.
#
#MaxLogSize 0
#
# MaxRequestSize: controls the maximum size of print files. Set to 0 to
# disable this feature (defaults to 0.)
#
#MaxRequestSize 0
#
# HostNameLookups: whether or not to do lookups on IP addresses to get a
# fully-qualified hostname. This defaults to Off for performance reasons...
#
#HostNameLookups On
#
# Timeout: the timeout before requests time out. Default is 300 seconds.
#
#Timeout 300
#
# KeepAlive: whether or not to support the Keep-Alive connection
# option. Default is on.
#
#KeepAlive On
#
# KeepAliveTimeout: the timeout before Keep-Alive connections are
# automatically closed. Default is 60 seconds.
#
#KeepAliveTimeout 60
#
# ImplicitClasses: whether or not to use implicit classes.
#
# Printer classes can be specified explicitly in the classes.conf
# file, implicitly based upon the printers available on the LAN, or
# both.
#
# When ImplicitClasses is On, printers on the LAN with the same name
# (e.g. Acme-LaserPrint-1000) will be put into a class with the same
# name. This allows you to setup multiple redundant queues on a LAN
# without a lot of administrative difficulties. If a user sends a
# job to Acme-LaserPrint-1000, the job will go to the first available
# queue.
#
# Enabled by default.
#
#ImplicitClasses On
#
# Browsing: whether or not to broadcast printer information to
# other CUPS servers. Enabled by default.
#
#Browsing On
#
# BrowseInterval: the time between browsing updates in seconds. Default
# is 30 seconds.
#
# Note that browsing information is sent whenever a printer's state changes
# as well, so this represents the maximum time between updates.
#
#BrowseInterval 30
#
# BrowseTimeout: the timeout for network printers - if we don't
# get an update within this time the printer will be removed
# from the printer list. This number definitely should not be
# less the BrowseInterval value for obvious reasons. Defaults
# to 300 seconds.
#
#BrowseTimeout 300
#
# BrowsePort: the port used for UDP broadcasts. By default this is
# the IPP port; if you change this you need to do it on all servers.
# Only one BrowsePort is recognized.
#
#BrowsePort 631
#
# BrowseAddress: specifies a broadcast address to be used. By
# default browsing information is broadcast to all active interfaces.
#
# Note: HP-UX 10.20 and earlier do not properly handle broadcast unless
# you have a Class A, B, C, or D netmask (i.e. no CIDR support).
#
#BrowseAddress x.y.z.255
#BrowseAddress x.y.255.255
#BrowseAddress x.255.255.255
#
# DocumentRoot: the root directory for HTTP documents that are served.
# By default the compiled in directory.
#
#DocumentRoot /usr/share/cups/doc
#
# DefaultLanguage: the default language if not specified by the browser.
# If not specified, the current locale is used.
#
#DefaultLanguage en
#
# DefaultCharset: the default character set to use. If not specified,
# defaults to iso-8859-1. Note that this can also be overridden in
# HTML documents...
#
#DefaultCharset iso-8859-1
#
# RIPCache: the amount of memory that each RIP should use to cache
# bitmaps. The value can be any real number followed by "k" for
# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
# (1 tile = 256x256 pixels.) Defaults to "32m" (32 megabytes).
#
#RIPCache: 32m
#
# Access permissions for each directory served by the scheduler.
# Locations are relative to DocumentRoot...
#
# AuthType: the authorization to use; currently only "Basic" authorization is
# supported.
#
# AuthClass: the authorization class; currently only "Anonymous", "User",
# "System" (valid user belonging to group SystemGroup), and "Group"
# (valid user belonging to the specified group) are supported.
#
# AuthGroupName: the group name for "Group" authorization.
#
# Order: the order of Allow/Deny processing.
#
# Allow: allows access from the specified hostname, domain, IP address, or
# network.
#
# Deny: denies access from the specified hostname, domain, IP address, or
# network.
#
<Location />
</Location>
<Location /printers>
#
# You may wish to limit access to printers and classes, either with Allow
# and Deny lines, or by requiring a username and password.
#
## Require a username and password
#AuthType Basic
#AuthClass User
## Restrict access to local domain
#Order Deny,Allow
#Deny From All
#Allow From .mydomain.com
</Location>
<Location /admin>
#
# You definitely will want to limit access to the administration tools.
# The default configuration requires a local connection from a user who
# is a member of group "sys" to do any admin tasks. You can change the
# group name using the SystemGroup directive.
#
AuthType Basic
AuthClass System
## Restrict access to local domain
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
#
# End of "$Id: cupsd.conf 349 1999-05-21 20:53:02Z mike $".
#
+825
Ver Arquivo
@@ -0,0 +1,825 @@
#
# "$Id$"
#
# Sample configuration file for the Common UNIX Printing System (CUPS)
# scheduler.
#
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
########################################################################
# #
# This is the CUPS configuration file. If you are familiar with #
# Apache or any of the other popular web servers, we've followed the #
# same format. Any configuration variable used here has the same #
# semantics as the corresponding variable in Apache. If we need #
# different functionality then a different name is used to avoid #
# confusion... #
# #
########################################################################
########
######## Server Identity
########
#
# ServerName: the hostname of your server, as advertised to the world.
# By default CUPS will use the hostname of the system.
#
# To set the default server used by clients, see the client.conf file.
#
#ServerName myhost.domain.com
#
# ServerAdmin: the email address to send all complaints/problems to.
# By default CUPS will use "root@hostname".
#
#ServerAdmin root@your.domain.com
########
######## Server Options
########
#
# AccessLog: the access log file; if this does not start with a leading /
# then it is assumed to be relative to ServerRoot. By default set to
# "@CUPS_LOGDIR@/access_log"
#
# You can also use the special name "syslog" to send the output to the
# syslog file or daemon.
#
#AccessLog @CUPS_LOGDIR@/access_log
#
# Classification: the classification level of the server. If set, this
# classification is displayed on all pages, and raw printing is disabled.
# The default is the empty string.
#
#Classification classified
#Classification confidential
#Classification secret
#Classification topsecret
#Classification unclassified
#
# ClassifyOverride: whether to allow users to override the classification
# on printouts. If enabled, users can limit banner pages to before or
# after the job, and can change the classification of a job, but cannot
# completely eliminate the classification or banners.
#
# The default is off.
#
#ClassifyOverride off
#
# DataDir: the root directory for the CUPS data files.
# By default "@CUPS_DATADIR@".
#
#DataDir @CUPS_DATADIR@
#
# DefaultCharset: the default character set to use. If not specified,
# defaults to "utf-8". Note that this can also be overridden in
# HTML documents...
#
#DefaultCharset utf-8
#
# DefaultLanguage: the default language if not specified by the browser.
# If not specified, the current locale is used.
#
#DefaultLanguage en
#
# DocumentRoot: the root directory for HTTP documents that are served.
# By default "@CUPS_DOCROOT@".
#
#DocumentRoot @CUPS_DOCROOT@
#
# ErrorLog: the error log file; if this does not start with a leading /
# then it is assumed to be relative to ServerRoot. By default set to
# "@CUPS_LOGDIR@/error_log"
#
# You can also use the special name "syslog" to send the output to the
# syslog file or daemon.
#
#ErrorLog @CUPS_LOGDIR@/error_log
#
# FileDevice: determines whether the scheduler will allow new printers
# to be added using device URIs of the form "file:/foo/bar". The default
# is not to allow file devices due to the potential security vulnerability
# and due to the fact that file devices do not support raw printing.
#
#FileDevice No
#
# FontPath: the path to locate all font files (currently only for pstoraster)
# By default "@CUPS_FONTPATH@".
#
#FontPath @CUPS_FONTPATH@
#
# LogLevel: controls the number of messages logged to the ErrorLog
# file and can be one of the following:
#
# debug2 Log everything.
# debug Log almost everything.
# info Log all requests and state changes.
# warn Log errors and warnings.
# error Log only errors.
# none Log nothing.
#
LogLevel info
#
# MaxLogSize: controls the maximum size of each log file before they are
# rotated. Defaults to 1048576 (1MB). Set to 0 to disable log rotating.
#
#MaxLogSize 0
#
# PageLog: the page log file; if this does not start with a leading /
# then it is assumed to be relative to ServerRoot. By default set to
# "@CUPS_LOGDIR@/page_log"
#
# You can also use the special name "syslog" to send the output to the
# syslog file or daemon.
#
#PageLog @CUPS_LOGDIR@/page_log
#
# PreserveJobHistory: whether or not to preserve the job history after a
# job is completed, cancelled, or stopped. Default is Yes.
#
#PreserveJobHistory Yes
#
# PreserveJobFiles: whether or not to preserve the job files after a
# job is completed, cancelled, or stopped. Default is No.
#
#PreserveJobFiles No
#
# AutoPurgeJobs: automatically purge jobs when not needed for quotas.
# Default is No.
#
#AutoPurgeJobs No
#
# MaxCopies: maximum number of copies that a user can request. Default is
# 100.
#
#MaxCopies 100
#
# MaxJobs: maximum number of jobs to keep in memory (active and completed.)
# Default is 500; the value 0 is used for no limit.
#
#MaxJobs 500
#
# MaxJobsPerPrinter: maximum number of active jobs per printer. The default
# is 0 for no limit.
#
#MaxJobsPerPrinter 0
#
# MaxJobsPerUser: maximum number of active jobs per user. The default
# is 0 for no limit.
#
#MaxJobsPerUser 0
#
# MaxPrinterHistory: controls the maximum number of history collections
# in the printer-state-history attribute. Set to 0 to disable history
# data.
#
#MaxPrinterHistory 10
#
# Printcap: the name of the printcap file. Default is /etc/printcap.
# Leave blank to disable printcap file generation.
#
#Printcap /etc/printcap
#
# PrintcapFormat: the format of the printcap file, currently either
# BSD or Solaris. The default is "BSD".
#
#PrintcapFormat BSD
#PrintcapFormat Solaris
#
# PrintcapGUI: the name of the GUI options panel program to associate
# with print queues under IRIX. The default is "/usr/bin/glpoptions"
# from ESP Print Pro.
#
# This option is only used under IRIX; the options panel program
# must accept the "-d printer" and "-o options" options and write
# the selected printer options back to stdout on completion.
#
#PrintcapGUI /usr/bin/glpoptions
#
# RequestRoot: the directory where request files are stored.
# By default "@CUPS_REQUESTS@".
#
#RequestRoot @CUPS_REQUESTS@
#
# RemoteRoot: the name of the user assigned to unauthenticated accesses
# from remote systems. By default "remroot".
#
#RemoteRoot remroot
#
# ServerBin: the root directory for the scheduler executables.
# By default "@CUPS_SERVERBIN@".
#
#ServerBin @CUPS_SERVERBIN@
#
# ServerRoot: the root directory for the scheduler.
# By default "@CUPS_SERVERROOT@".
#
#ServerRoot @CUPS_SERVERROOT@
########
######## Fax Support
########
#
# FaxRetryLimit: the number of times a fax job is retried.
# The default is 5 times.
#
#FaxRetryLimit 5
#
# FaxRetryInterval: the number of seconds between fax job retries.
# The default is 300 seconds/5 minutes.
#
#FaxRetryInterval 300
########
######## Encryption Support
########
#
# ServerCertificate: the file to read containing the server's certificate.
# Defaults to "@CUPS_SERVERROOT@/ssl/server.crt".
#
#ServerCertificate @CUPS_SERVERROOT@/ssl/server.crt
#
# ServerKey: the file to read containing the server's key.
# Defaults to "@CUPS_SERVERROOT@/ssl/server.key".
#
#ServerKey @CUPS_SERVERROOT@/ssl/server.key
########
######## Filter Options
########
#
# User/Group: the user and group the server runs under. Normally this
# must be @CUPS_USER@ and @CUPS_GROUP@, however you can configure things for another
# user or group as needed.
#
# Note: the server must be run initially as root to support the
# default IPP port of 631. It changes users whenever an external
# program is run, or if the RunAsUser directive is specified...
#
#User @CUPS_USER@
#Group @CUPS_GROUP@
#
# RIPCache: the amount of memory that each RIP should use to cache
# bitmaps. The value can be any real number followed by "k" for
# kilobytes, "m" for megabytes, "g" for gigabytes, or "t" for tiles
# (1 tile = 256x256 pixels.) Defaults to "8m" (8 megabytes).
#
#RIPCache 8m
#
# TempDir: the directory to put temporary files in. This directory must be
# writable by the user defined above! Defaults to "@CUPS_REQUESTS@/tmp" or
# the value of the TMPDIR environment variable.
#
#TempDir @CUPS_REQUESTS@/tmp
#
# FilterLimit: sets the maximum cost of all job filters that can be run
# at the same time. A limit of 0 means no limit. A typical job may need
# a filter limit of at least 200; limits less than the minimum required
# by a job force a single job to be printed at any time.
#
# The default limit is 0 (unlimited).
#
#FilterLimit 0
########
######## Network Options
########
#
# Ports/addresses that we listen to. The default port 631 is reserved
# for the Internet Printing Protocol (IPP) and is what we use here.
#
# You can have multiple Port/Listen lines to listen to more than one
# port or address, or to restrict access:
#
# Port 80
# Port 631
# Listen hostname
# Listen hostname:80
# Listen hostname:631
# Listen 1.2.3.4
# Listen 1.2.3.4:631
#
# NOTE: Unfortunately, most web browsers don't support TLS or HTTP Upgrades
# for encryption. If you want to support web-based encryption you'll
# probably need to listen on port 443 (the "https" port...)
#
#Port 80
#Port 443
Port 631
#
# HostNameLookups: whether or not to do lookups on IP addresses to get a
# fully-qualified hostname. This defaults to Off for performance reasons...
#
#HostNameLookups On
#
# KeepAlive: whether or not to support the Keep-Alive connection
# option. Default is on.
#
#KeepAlive On
#
# KeepAliveTimeout: the timeout before Keep-Alive connections are
# automatically closed. Default is 60 seconds.
#
#KeepAliveTimeout 60
#
# MaxClients: controls the maximum number of simultaneous clients that
# will be handled. Defaults to 100.
#
#MaxClients 100
#
# MaxClientsPerHost: controls the maximum number of simultaneous clients that
# will be handled from a specific host. Defaults to 10 or 1/10th of the
# MaxClients setting, whichever is larger. A value of 0 specifies the
# automatic (10 or 1/10th) setting.
#
#MaxClientsPerHost 0
#
# MaxRequestSize: controls the maximum size of HTTP requests and print files.
# Set to 0 to disable this feature (defaults to 0.)
#
#MaxRequestSize 0
#
# Timeout: the timeout before requests time out. Default is 300 seconds.
#
#Timeout 300
########
######## Browsing Options
########
#
# Browsing: whether or not to broadcast and/or listen for CUPS printer
# information on the network. Enabled by default.
#
#Browsing On
#
# BrowseProtocols: which protocols to use for browsing. Can be
# any of the following separated by whitespace and/or commas:
#
# all - Use all supported protocols.
# cups - Use the CUPS browse protocol.
# slp - Use the SLPv2 protocol.
#
# The default is "cups".
#
# NOTE: If you choose to use SLPv2, it is *strongly* recommended that
# you have at least one SLP Directory Agent (DA) on your
# network. Otherwise, browse updates can take several seconds,
# during which the scheduler will not respond to client
# requests.
#
#BrowseProtocols cups
#
# BrowseAddress: specifies a broadcast address to be used. By
# default browsing information is not sent!
#
# Note: HP-UX does not properly handle broadcast unless you have a
# Class A, B, C, or D netmask (i.e. no CIDR support).
#
# Note: Using the "global" broadcast address (255.255.255.255) will
# activate a Linux demand-dial link with the default configuration.
# If you have a LAN as well as the dial-up link, use the LAN's
# broadcast address.
#
# The @LOCAL address broadcasts to all non point-to-point interfaces.
# For example, if you have a LAN and a dial-up link, @LOCAL would
# send printer updates to the LAN but not to the dial-up link.
# Similarly, the @IF(name) address sends to the named network
# interface, e.g. @IF(eth0) under Linux. Interfaces are refreshed
# automatically (no more than once every 60 seconds), so they can
# be used on dynamically-configured interfaces, e.g. PPP, 802.11, etc.
#
#BrowseAddress x.y.z.255
#BrowseAddress x.y.255.255
#BrowseAddress x.255.255.255
#BrowseAddress 255.255.255.255
#BrowseAddress @LOCAL
#BrowseAddress @IF(name)
#
# BrowseShortNames: whether or not to use "short" names for remote printers
# when possible (e.g. "printer" instead of "printer@host".) Enabled by
# default.
#
#BrowseShortNames Yes
#
# BrowseAllow: specifies an address mask to allow for incoming browser
# packets. The default is to allow packets from all addresses.
#
# BrowseDeny: specifies an address mask to deny for incoming browser
# packets. The default is to deny packets from no addresses.
#
# Both "BrowseAllow" and "BrowseDeny" accept the following notations for
# addresses:
#
# All
# None
# *.domain.com
# .domain.com
# host.domain.com
# nnn.*
# nnn.nnn.*
# nnn.nnn.nnn.*
# nnn.nnn.nnn.nnn
# nnn.nnn.nnn.nnn/mm
# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
# @LOCAL
# @IF(name)
#
# The hostname/domainname restrictions only work if you have turned hostname
# lookups on!
#
#BrowseAllow address
#BrowseDeny address
#
# BrowseInterval: the time between browsing updates in seconds. Default
# is 30 seconds.
#
# Note that browsing information is sent whenever a printer's state changes
# as well, so this represents the maximum time between updates.
#
# Set this to 0 to disable outgoing broadcasts so your local printers are
# not advertised but you can still see printers on other hosts.
#
#BrowseInterval 30
#
# BrowseOrder: specifies the order of BrowseAllow/BrowseDeny comparisons.
#
#BrowseOrder allow,deny
#BrowseOrder deny,allow
#
# BrowsePoll: poll the named server(s) for printers
#
#BrowsePoll address:port
#
# BrowsePort: the port used for UDP broadcasts. By default this is
# the IPP port; if you change this you need to do it on all servers.
# Only one BrowsePort is recognized.
#
#BrowsePort 631
#
# BrowseRelay: relay browser packets from one address/network to another.
#
#BrowseRelay source-address destination-address
#BrowseRelay @IF(src) @IF(dst)
#
# BrowseTimeout: the timeout for network printers - if we don't
# get an update within this time the printer will be removed
# from the printer list. This number definitely should not be
# less the BrowseInterval value for obvious reasons. Defaults
# to 300 seconds.
#
#BrowseTimeout 300
#
# ImplicitClasses: whether or not to use implicit classes.
#
# Printer classes can be specified explicitly in the classes.conf
# file, implicitly based upon the printers available on the LAN, or
# both.
#
# When ImplicitClasses is On, printers on the LAN with the same name
# (e.g. Acme-LaserPrint-1000) will be put into a class with the same
# name. This allows you to setup multiple redundant queues on a LAN
# without a lot of administrative difficulties. If a user sends a
# job to Acme-LaserPrint-1000, the job will go to the first available
# queue.
#
# Enabled by default.
#
#ImplicitClasses On
#
# ImplicitAnyClasses: whether or not to create "AnyPrinter" implicit
# classes.
#
# When ImplicitAnyClasses is On and a local queue of the same name
# exists, e.g. "printer", "printer@server1", "printer@server1", then
# an implicit class called "Anyprinter" is created instead.
#
# When ImplicitAnyClasses is Off, implicit classes are not created
# when there is a local queue of the same name.
#
# Disabled by default.
#
#ImplicitAnyCLasses Off
#
# HideImplicitMembers: whether or not to show the members of an
# implicit class.
#
# When HideImplicitMembers is On, any remote printers that are
# part of an implicit class are hidden from the user, who will
# then only see a single queue even though many queues will be
# supporting the implicit class.
#
# Enabled by default.
#
#HideImplicitMembers On
########
######## Security Options
########
#
# SystemGroup: the group name for "System" (printer administration)
# access. The default varies depending on the operating system, but
# will be "sys", "system", or "root" (checked for in that order.)
#
#SystemGroup @CUPS_GROUP@
#
# RootCertDuration: How frequently the root certificate is regenerated.
# Defaults to 300 seconds.
#
#RootCertDuration 300
#
# Access permissions for each directory served by the scheduler.
# Locations are relative to DocumentRoot...
#
# AuthType: the authorization to use:
#
# None - Perform no authentication
# Basic - Perform authentication using the HTTP Basic method.
# Digest - Perform authentication using the HTTP Digest method.
#
# (Note: local certificate authentication can be substituted by
# the client for Basic or Digest when connecting to the
# localhost interface)
#
# AuthClass: the authorization class; currently only "Anonymous", "User",
# "System" (valid user belonging to group SystemGroup), and "Group"
# (valid user belonging to the specified group) are supported.
#
# AuthGroupName: the group name for "Group" authorization.
#
# Order: the order of Allow/Deny processing.
#
# Allow: allows access from the specified hostname, domain, IP address,
# network, or interface.
#
# Deny: denies access from the specified hostname, domain, IP address,
# network, or interface.
#
# 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
# @LOCAL
# @IF(name)
#
# The host and domain address require that you enable hostname lookups
# with "HostNameLookups On" above.
#
# The @LOCAL address allows or denies from all non point-to-point
# interfaces. For example, if you have a LAN and a dial-up link,
# @LOCAL could allow connections from the LAN but not from the dial-up
# link. Similarly, the @IF(name) address allows or denies from the
# named network interface, e.g. @IF(eth0) under Linux. Interfaces are
# refreshed automatically (no more than once every 60 seconds), so
# they can be used on dynamically-configured interfaces, e.g. PPP,
# 802.11, etc.
#
# Encryption: whether or not to use encryption; this depends on having
# the OpenSSL library linked into the CUPS library and scheduler.
#
# Possible values:
#
# Always - Always use encryption (SSL)
# Never - Never use encryption
# Required - Use TLS encryption upgrade
# IfRequested - Use encryption if the server requests it
#
# The default value is "IfRequested".
#
<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
#<Location /classes>
#
# You may wish to limit access to printers and classes, either with Allow
# and Deny lines, or by requiring a username and password.
#
#</Location>
#<Location /classes/name>
#
# You may wish to limit access to printers and classes, either with Allow
# and Deny lines, or by requiring a username and password.
#
#</Location>
#<Location /jobs>
#
# You may wish to limit access to job operations, either with Allow
# and Deny lines, or by requiring a username and password.
#
#</Location>
#<Location /printers>
#
# You may wish to limit access to printers and classes, either with Allow
# and Deny lines, or by requiring a username and password.
#
#</Location>
#<Location /printers/name>
#
# You may wish to limit access to printers and classes, either with Allow
# and Deny lines, or by requiring a username and password.
#
## Anonymous access (default)
#AuthType None
## Require a username and password (Basic authentication)
#AuthType Basic
#AuthClass User
## Require a username and password (Digest/MD5 authentication)
#AuthType Digest
#AuthClass User
## Restrict access to local domain
#Order Deny,Allow
#Deny From All
#Allow From .mydomain.com
#</Location>
<Location /admin>
#
# You definitely will want to limit access to the administration functions.
# 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.
#
AuthType Basic
AuthClass System
## Restrict access to local domain
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
#Encryption Required
</Location>
#
# End of "$Id$".
#
+72 -16
Ver Arquivo
@@ -1,9 +1,9 @@
#
# "$Id: mime.convs 237 1999-04-21 19:29:35Z mike $"
# "$Id: mime.convs 3709 2003-05-12 17:38:18Z mike $"
#
# MIME converts file for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products.
# Copyright 1997-2003 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -30,10 +30,12 @@
#
# General Notes:
#
# Currently the "cost" field is not used (all filters are assumed to
# be equally costly in terms of speed/memory). Also, a filter program
# *must* accept the standard command-line arguments (job-id, user, title,
# copies,options,[filename or stdin]) or this won't work.
# The "cost" field is used to find the least costly filters to run
# when converting a job file to a printable format.
#
# All filters *must* accept the standard command-line arguments
# (job-id, user, title, copies, options, [filename or stdin]) to
# work with CUPS.
#
########################################################################
@@ -41,22 +43,76 @@
# PostScript filters
#
application/msword application/postscript 50 mswordtops
application/pdf application/postscript 50 pdftops
application/postscript application/vnd.cups-postscript 50 pstops
application/vnd.hp-HPGL application/postscript 50 hpgltops
image/* application/vnd.cups-postscript 50 imagetops
text/html application/postscript 50 htmltops
text/plain application/postscript 50 texttops
application/pdf application/postscript 33 pdftops
application/postscript application/vnd.cups-postscript 66 pstops
application/vnd.hp-HPGL application/postscript 66 hpgltops
application/x-cshell application/postscript 33 texttops
application/x-perl application/postscript 33 texttops
application/x-shell application/postscript 33 texttops
text/plain application/postscript 33 texttops
text/html application/postscript 33 texttops
image/gif application/vnd.cups-postscript 66 imagetops
image/png application/vnd.cups-postscript 66 imagetops
image/jpeg application/vnd.cups-postscript 66 imagetops
image/tiff application/vnd.cups-postscript 66 imagetops
image/x-bitmap application/vnd.cups-postscript 66 imagetops
image/x-photocd application/vnd.cups-postscript 66 imagetops
image/x-portable-anymap application/vnd.cups-postscript 66 imagetops
image/x-portable-bitmap application/vnd.cups-postscript 66 imagetops
image/x-portable-graymap application/vnd.cups-postscript 66 imagetops
image/x-portable-pixmap application/vnd.cups-postscript 66 imagetops
image/x-sgi-rgb application/vnd.cups-postscript 66 imagetops
image/x-xbitmap application/vnd.cups-postscript 66 imagetops
image/x-xpixmap application/vnd.cups-postscript 66 imagetops
#image/x-xwindowdump application/vnd.cups-postscript 66 imagetops
image/x-sun-raster application/vnd.cups-postscript 66 imagetops
########################################################################
#
# Form filter...
#
# This filter does not currently exist, but the file format is defined
# in the IDD and registered with the IANA for future use...
#
#application/vnd.cups-form application/vnd.cups-postscript 33 formtops
########################################################################
#
# Raster filters...
#
image/* application/vnd.cups-raster 50 imagetoraster
application/vnd.cups-postscript application/vnd.cups-raster 50 pstoraster
image/gif application/vnd.cups-raster 100 imagetoraster
image/png application/vnd.cups-raster 100 imagetoraster
image/jpeg application/vnd.cups-raster 100 imagetoraster
image/tiff application/vnd.cups-raster 100 imagetoraster
image/x-bitmap application/vnd.cups-raster 100 imagetoraster
image/x-photocd application/vnd.cups-raster 100 imagetoraster
image/x-portable-anymap application/vnd.cups-raster 100 imagetoraster
image/x-portable-bitmap application/vnd.cups-raster 100 imagetoraster
image/x-portable-graymap application/vnd.cups-raster 100 imagetoraster
image/x-portable-pixmap application/vnd.cups-raster 100 imagetoraster
image/x-sgi-rgb application/vnd.cups-raster 100 imagetoraster
image/x-xbitmap application/vnd.cups-raster 100 imagetoraster
image/x-xpixmap application/vnd.cups-raster 100 imagetoraster
#image/x-xwindowdump application/vnd.cups-raster 100 imagetoraster
image/x-sun-raster application/vnd.cups-raster 100 imagetoraster
# pstoraster is now part of ESP Ghostscript...
#application/vnd.cups-postscript application/vnd.cups-raster 100 pstoraster
########################################################################
#
# Raw filter...
#
# Uncomment the following filter and the application/octet-stream type
# in mime.types to allow printing of arbitrary files without the -oraw
# option.
#
#application/octet-stream application/vnd.cups-raw 0 -
#
# End of "$Id: mime.convs 237 1999-04-21 19:29:35Z mike $".
# End of "$Id: mime.convs 3709 2003-05-12 17:38:18Z mike $".
#
+59 -21
Ver Arquivo
@@ -1,9 +1,9 @@
#
# "$Id: mime.types 185 1999-03-24 18:38:50Z mike $"
# "$Id: mime.types 3564 2003-04-07 18:03:28Z mike $"
#
# MIME types file for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products.
# Copyright 1997-2003 by Easy Software Products.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -39,12 +39,15 @@
# ascii(offset,length) True if bytes are valid printable ASCII
# (CR, NL, TAB, BS, 32-126)
# printable(offset,length) True if bytes are printable 8-bit chars
# (CR, NL, TAB, BS, 32-126, 160-254)
# (CR, NL, TAB, BS, 32-126, 128-254)
# string(offset,"string") True if bytes are identical to string
# istring(offset,"string") True if bytes are identical to
# case-insensitive string
# char(offset,value) True if byte is identical
# short(offset,value) True if 16-bit integer is identical
# int(offset,value) True if 32-bit integer is identical
# locale("string") True if current locale matches string
# contains(offset,range,"string") True if the range contains the string
#
# General Notes:
#
@@ -56,10 +59,10 @@
# type in the sorted list.
#
# The "printable" rule differs from the "ascii" rule in that it also
# accepts 8-bit characters in the range 160-254.
# accepts 8-bit characters in the range 128-255.
#
# String constants must be surrounded by "" if they contain whitespace.
# To instead binary data into a string, use the <hex> notation.
# To insert binary data into a string, use the <hex> notation.
#
########################################################################
@@ -67,12 +70,21 @@
# Application-generated files...
#
application/msword doc string(0,<D0CF11E0A1B11AE1>)
#application/msword doc string(0,<D0CF11E0A1B11AE1>)
application/pdf pdf string(0,%PDF)
application/postscript ai eps ps string(0,%!) string(0,<04>%!)
application/vnd.hp-HPGL hpgl string(0,<1b>%) string(0,<1b>&)\
string(0,<1b>E) string(0,<201b>)\
string(0,BP;) string(0,IN;) string(0,DF;)
application/postscript ai eps ps string(0,%!) string(0,<04>%!) \
contains(0,128,<1B>%-12345X) + \
(contains(0,1024,"LANGUAGE=POSTSCRIPT") \
contains(0,1024,"LANGUAGE = Postscript") \
contains(0,1024,"LANGUAGE = POSTSCRIPT"))
application/vnd.hp-HPGL hpgl string(0,<1B>&)\
string(0,<1B>E<1B>%0B) \
string(0,<1B>%-1B) string(0,<201B>)\
string(0,BP;) string(0,IN;) string(0,DF;) \
string(0,BPINPS;) \
(contains(0,128,<1B>%-12345X) + \
(contains(0,1024,"LANGUAGE=HPGL") \
contains(0,1024,"LANGUAGE = HPGL")))
########################################################################
#
@@ -81,7 +93,11 @@ application/vnd.hp-HPGL hpgl string(0,<1b>%) string(0,<1b>&)\
image/gif gif string(0,GIF87a) string(0,GIF89a)
image/png png string(0,<89>PNG)
image/jpeg jpeg jpg jpe string(6,JFIF)
image/jpeg jpeg jpg jpe string(0,<FFD8FF>) &&\
(char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\
char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\
char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\
char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef))
image/tiff tiff tif string(0,MM) string(0,II)
image/x-photocd pcd string(2048,PCD_IPI)
image/x-portable-anymap pnm
@@ -91,14 +107,12 @@ image/x-portable-pixmap ppm string(0,P3) string(0,P6)
image/x-sgi-rgb rgb sgi bw icon short(0,474)
image/x-xbitmap xbm
image/x-xpixmap xpm ascii(0,1024) + string(3,"XPM")
image/x-xwindowdump xwd
#image/x-xwindowdump xwd string(4,<00000007>)
image/x-sun-raster ras string(0,<59a66a95>)
# 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
#image/fpx fpx
image/x-alias pix short(8,8) short(8,24)
image/x-bitmap bmp string(0,BM) && !printable(2,14)
########################################################################
#
@@ -106,7 +120,14 @@ image/x-sun-raster ras
#
text/html html htm printable(0,1024) +\
(string(0,"<HTML>") string(0,"<!DOCTYPE"))
(istring(0,"<HTML>") istring(0,"<!DOCTYPE"))
application/x-cshell csh printable(0,1024) + string(0,#!) +\
(contains(2,80,/csh) contains(2,80,/tcsh))
application/x-perl pl printable(0,1024) + string(0,#!) +\
contains(2,80,/perl)
application/x-shell sh printable(0,1024) + string(0,#!) +\
(contains(2,80,/bash) contains(2,80,/ksh)\
contains(2,80,/sh) contains(2,80,/zsh))
text/plain txt printable(0,1024)
########################################################################
@@ -114,10 +135,27 @@ text/plain txt printable(0,1024)
# CUPS-specific types...
#
application/vnd.cups-command string(0,'#CUPS-COMMAND')
application/vnd.cups-form string(0,"<CUPSFORM>")
application/vnd.cups-postscript
application/vnd.cups-raster string(0,"RaSt") string(0,"tSaR")
application/vnd.cups-raw
application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
string(0,<1B>@) \
(contains(0,128,<1B>%-12345X) + \
(contains(0,1024,"LANGUAGE=PCL") \
contains(0,1024,"LANGUAGE = PCL")))
########################################################################
#
# Raw print file support...
#
# Uncomment the following type and the application/octet-stream
# filter line in mime.convs to allow raw file printing without the
# -oraw option.
#
#application/octet-stream
#
# End of "$Id: mime.types 185 1999-03-24 18:38:50Z mike $".
# End of "$Id: mime.types 3564 2003-04-07 18:03:28Z mike $".
#
+2
Ver Arquivo
@@ -0,0 +1,2 @@
auth required @PAMMOD@ nullok shadow
account required @PAMMOD@
+3
Ver Arquivo
@@ -0,0 +1,3 @@
#%PAM-1.0
auth required pam_unix.so shadow nodelay nullok
account required pam_unix.so
+2
Ver Arquivo
@@ -0,0 +1,2 @@
# This is a dummy printcap file that is automatically generated by the
# CUPS software for old applications that rely on it.
+18 -11
Ver Arquivo
@@ -1,10 +1,10 @@
#
# "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $"
# "$Id: printers.conf 3041 2002-12-17 19:00:27Z swdev $"
#
# Sample printer configuration file for the Common UNIX Printing System
# (CUPS) scheduler.
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -15,7 +15,7 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
@@ -47,12 +47,6 @@
#Info Acme LaserPrint 1000
#
# MoreInfo: a URL for more information on the printer.
#
#MoreInfo http://www.acme.com/lp1000.html
#
# Location: the location of the printer.
#
@@ -77,13 +71,26 @@
# State: sets the initial state of the printer. Can be one of the
# following:
#
# Idle - Printer is available to accept new jobs.
# Idle - Printer is available to print new jobs.
# Stopped - Printer is disabled but accepting new jobs.
#
#State Idle
#
# StateMessage: sets the printer-state-message attribute for the printer.
#
#StateMessage Printer is idle.
#
# Accepting: is the printer accepting jobs?
#
#Accepting Yes
#Accepting No
#</Printer>
#
# End of "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $".
# End of "$Id: printers.conf 3041 2002-12-17 19:00:27Z swdev $".
#
+206
Ver Arquivo
@@ -0,0 +1,206 @@
dnl
dnl "$Id: cups-common.m4 3993 2003-11-07 20:18:02Z mike $"
dnl
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
dnl We need at least autoconf 2.50...
AC_PREREQ(2.50)
dnl Set the name of the config header file...
AC_CONFIG_HEADER(config.h)
dnl Version number information...
CUPS_VERSION="1.1.20rc6"
AC_SUBST(CUPS_VERSION)
AC_DEFINE_UNQUOTED(CUPS_SVERSION, "CUPS v$CUPS_VERSION")
dnl Default compiler flags...
CFLAGS="${CFLAGS:=}"
CPPFLAGS="${CPPFLAGS:=}"
CXXFLAGS="${CXXFLAGS:=}"
LDFLAGS="${LDFLAGS:=}"
dnl Checks for programs...
AC_PROG_AWK
AC_PROG_CC
AC_PROG_CXX
AC_PROG_CPP
AC_PROG_INSTALL
if test "$INSTALL" = "$ac_install_sh"; then
# Use full path to install-sh script...
INSTALL="`pwd`/install-sh -c"
fi
AC_PROG_RANLIB
AC_PATH_PROG(AR,ar)
AC_PATH_PROG(HTMLDOC,htmldoc)
AC_PATH_PROG(LN,ln)
AC_PATH_PROG(MV,mv)
AC_PATH_PROG(NROFF,nroff)
if test "$NROFF" = ""; then
AC_PATH_PROG(GROFF,groff)
if test "$GROFF" = ""; then
NROFF="echo"
else
NROFF="$GROFF -T ascii"
fi
fi
AC_PATH_PROG(RM,rm)
AC_PATH_PROG(SED,sed)
AC_PATH_PROG(STRIP,strip)
if test "x$AR" = x; then
AC_MSG_ERROR([Unable to find required library archive command.])
fi
if test "x$CC" = x; then
AC_MSG_ERROR([Unable to find required C compiler command.])
fi
if test "x$CXX" = x; then
AC_MSG_ERROR([Unable to find required C++ compiler command.])
fi
dnl Architecture checks...
AC_C_BIGENDIAN
dnl Check for libraries...
AC_SEARCH_LIBS(crypt, crypt)
AC_SEARCH_LIBS(getspent, sec gen)
LIBMALLOC=""
AC_ARG_ENABLE(mallinfo, [ --enable-mallinfo turn on malloc debug information, default=no])
if test x$enable_mallinfo = xyes; then
AC_CHECK_LIB(c,mallinfo,LIBS="$LIBS"; AC_DEFINE(HAVE_MALLINFO),LIBS="$LIBS")
if test "$ac_cv_lib_c_mallinfo" = "no"; then
AC_CHECK_LIB(malloc,mallinfo,
LIBS="$LIBS"
LIBMALLOC="-lmalloc"
AC_DEFINE(HAVE_MALLINFO),
LIBS="$LIBS")
fi
fi
AC_SUBST(LIBMALLOC)
dnl Check for libpaper support...
AC_ARG_ENABLE(libpaper, [ --enable-libpaper turn on libpaper support, default=no])
if test x$enable_libpaper = xyes; then
AC_CHECK_LIB(paper,systempapername,
AC_DEFINE(HAVE_LIBPAPER)
LIBPAPER="-lpaper",
LIBPAPER="")
else
LIBPAPER=""
fi
AC_SUBST(LIBPAPER)
dnl Checks for header files.
AC_HEADER_STDC
AC_HEADER_DIRENT
AC_CHECK_HEADER(crypt.h,AC_DEFINE(HAVE_CRYPT_H))
AC_CHECK_HEADER(malloc.h,AC_DEFINE(HAVE_MALLOC_H))
AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H))
AC_CHECK_HEADER(string.h,AC_DEFINE(HAVE_STRING_H))
AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H))
AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H))
AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H))
AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H))
dnl Checks for string functions.
AC_CHECK_FUNCS(strdup strcasecmp strncasecmp strlcat strlcpy)
if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then
echo Forcing snprintf emulation for HP-UX.
else
AC_CHECK_FUNCS(snprintf vsnprintf)
fi
dnl Check OS version and use appropriate format string for strftime...
AC_MSG_CHECKING(for correct format string to use with strftime)
case "$uname" in
IRIX* | SunOS*)
# IRIX and SunOS
AC_MSG_RESULT(NULL)
AC_DEFINE(CUPS_STRFTIME_FORMAT, NULL)
;;
*)
# All others
AC_MSG_RESULT("%c")
AC_DEFINE(CUPS_STRFTIME_FORMAT, "%c")
;;
esac
dnl Checks for mkstemp and mkstemps functions.
AC_CHECK_FUNCS(mkstemp mkstemps)
dnl Checks for vsyslog function.
AC_CHECK_FUNCS(vsyslog)
dnl Checks for signal functions.
if test "$uname" != "Linux"; then
AC_CHECK_FUNCS(sigset)
fi
AC_CHECK_FUNCS(sigaction)
dnl Checks for wait functions.
AC_CHECK_FUNCS(waitpid)
AC_CHECK_FUNCS(wait3)
dnl See if the tm structure has the tm_gmtoff member...
AC_MSG_CHECKING(for tm_gmtoff member in tm structure)
AC_TRY_COMPILE([#include <time.h>],[struct tm t;
int o = t.tm_gmtoff;],
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_TM_GMTOFF),
AC_MSG_RESULT(no))
dnl Flags for "ar" command...
case $uname in
Darwin* | *BSD*)
ARFLAGS="-rcv"
;;
*)
ARFLAGS="crvs"
;;
esac
AC_SUBST(ARFLAGS)
dnl Extra platform-specific libraries...
case $uname in
Darwin*)
BACKLIBS="-framework IOKit"
COMMONLIBS="-framework CoreFoundation"
;;
*)
BACKLIBS=""
COMMONLIBS=""
;;
esac
AC_SUBST(BACKLIBS)
AC_SUBST(COMMONLIBS)
dnl
dnl End of "$Id: cups-common.m4 3993 2003-11-07 20:18:02Z mike $".
dnl
+206
Ver Arquivo
@@ -0,0 +1,206 @@
dnl
dnl "$Id: cups-compiler.m4 3874 2003-08-20 18:27:48Z mike $"
dnl
dnl Common configuration stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
dnl Clear the debugging and non-shared library options unless the user asks
dnl for them...
OPTIM=""
AC_SUBST(OPTIM)
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging, default=no],
[if test x$enable_debug = xyes; then
OPTIM="-g"
fi])
AC_ARG_WITH(optim, [ --with-optim="flags" set optimization flags ])
dnl Update compiler options...
CXXLIBS=""
AC_SUBST(CXXLIBS)
if test -n "$GCC"; then
# Starting with GCC 3.0, you must link C++ programs against either
# libstdc++ (shared by default), or libsupc++ (always static). If
# you care about binary portability between Linux distributions,
# you need to either 1) build your own GCC with static C++ libraries
# or 2) link using gcc and libsupc++. We choose the latter since
# CUPS doesn't (currently) use any of the stdc++ library.
#
# Also, GCC 3.0.x still has problems compiling some code. You may
# or may not have success with it. USE 3.0.x WITH EXTREME CAUTION!
#
# Previous versions of GCC do not have the reliance on the stdc++
# or g++ libraries, so the extra supc++ library is not needed.
AC_MSG_CHECKING(if libsupc++ is required)
SUPC="`$CXX -print-file-name=libsupc++.a 2>/dev/null`"
case "$SUPC" in
libsupc++.a*)
# Library not found, so this is and older GCC...
AC_MSG_RESULT(no)
;;
*)
# This is gcc 3.x, and it knows of libsupc++, so we need it
CXXLIBS="-lsupc++"
AC_MSG_RESULT(yes)
;;
esac
CXX="$CC"
if test -z "$OPTIM"; then
if test "x$with_optim" = x; then
if test $uname = HP-UX; then
# GCC under HP-UX has bugs with -O2
OPTIM="-O1"
else
OPTIM="-O2"
fi
else
OPTIM="$with_optim $OPTIM"
fi
fi
if test $PICFLAG = 1 -a $uname != AIX; then
OPTIM="-fPIC $OPTIM"
fi
if test "x$with_optim" = x; then
OPTIM="-Wall $OPTIM"
fi
else
case $uname in
AIX*)
if test -z "$OPTIM"; then
if test "x$with_optim" = x; then
OPTIM="-O2 -qmaxmem=6000"
else
OPTIM="$with_optim $OPTIM"
fi
fi
;;
HP-UX*)
if test -z "$OPTIM"; then
if test "x$with_optim" = x; then
OPTIM="+O2"
else
OPTIM="$with_optim $OPTIM"
fi
fi
CFLAGS="-Ae $CFLAGS"
if test "x$with_optim" = x; then
OPTIM="+DAportable $OPTIM"
fi
if test $PICFLAG = 1; then
OPTIM="+z $OPTIM"
fi
;;
IRIX*)
if test -z "$OPTIM"; then
if test "x$with_optim" = x; then
OPTIM="-O2"
else
OPTIM="$with_optim $OPTIM"
fi
fi
if test $uversion -ge 62 -a "x$with_optim" = x; then
OPTIM="$OPTIM -n32 -mips3"
fi
if test "x$with_optim" = x; then
# Show most warnings, but suppress the
# ones about arguments not being used,
# string constants assigned to const
# char *'s, etc. We only set the warning
# options on IRIX 6.2 and higher because
# of limitations in the older SGI compiler
# tools.
if test $uversion -ge 62; then
OPTIM="-fullwarn -woff 1183,1209,1349,3201 $OPTIM"
fi
fi
;;
SunOS*)
# Solaris
if test -z "$OPTIM"; then
if test "x$with_optim" = x; then
OPTIM="-xO4"
else
OPTIM="$with_optim $OPTIM"
fi
fi
if test "x$with_optim" = x; then
# Specify "generic" SPARC output and suppress
# all of Sun's questionable warning messages...
OPTIM="-w $OPTIM -xarch=generic"
fi
if test $PICFLAG = 1; then
OPTIM="-KPIC $OPTIM"
fi
;;
UNIX_SVR*)
# UnixWare
if test -z "$OPTIM"; then
if test "x$with_optim" = x; then
OPTIM="-O"
else
OPTIM="$with_optim $OPTIM"
fi
fi
if test $PICFLAG = 1; then
OPTIM="-KPIC $OPTIM"
fi
;;
*)
# Running some other operating system; inform the user they
# should contribute the necessary options to
# cups-support@cups.org...
echo "Building CUPS with default compiler optimizations; contact"
echo "cups-bugs@cups.org with uname and compiler options needed"
echo "for your platform, or set the CFLAGS and CXXFLAGS"
echo "environment variable before running configure."
;;
esac
fi
if test $uname = HP-UX; then
# HP-UX 10.20 (at least) needs this definition to get the
# h_errno global...
OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED"
# HP-UX 11.00 (at least) needs this definition to get the
# u_short type used by the IP headers...
OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE"
fi
dnl
dnl End of "$Id: cups-compiler.m4 3874 2003-08-20 18:27:48Z mike $".
dnl
+242
Ver Arquivo
@@ -0,0 +1,242 @@
dnl
dnl "$Id: cups-directories.m4 3041 2002-12-17 19:00:27Z swdev $"
dnl
dnl Directory stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
AC_PREFIX_DEFAULT(/)
AC_ARG_WITH(fontpath, [ --with-fontpath set font path for pstoraster],fontpath="$withval",fontpath="")
AC_ARG_WITH(docdir, [ --with-docdir set path for documentation],docdir="$withval",docdir="")
AC_ARG_WITH(logdir, [ --with-logdir set path for log files],logdir="$withval",logdir="")
AC_ARG_WITH(rcdir, [ --with-rcdir set path for rc scripts],rcdir="$withval",rcdir="")
dnl Fix "prefix" variable if it hasn't been specified...
if test "$prefix" = "NONE"; then
prefix="/"
fi
dnl Fix "exec_prefix" variable if it hasn't been specified...
if test "$exec_prefix" = "NONE"; then
if test "$prefix" = "/"; then
exec_prefix="/usr"
else
exec_prefix="$prefix"
fi
fi
dnl Fix "sharedstatedir" variable if it hasn't been specified...
if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then
sharedstatedir="/usr/com"
fi
dnl Fix "datadir" variable if it hasn't been specified...
if test "$datadir" = "\${prefix}/share"; then
if test "$prefix" = "/"; then
datadir="/usr/share"
else
datadir="$prefix/share"
fi
fi
dnl Fix "includedir" variable if it hasn't been specified...
if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then
includedir="/usr/include"
fi
dnl Fix "localstatedir" variable if it hasn't been specified...
if test "$localstatedir" = "\${prefix}/var"; then
if test "$prefix" = "/"; then
localstatedir="/var"
else
localstatedir="$prefix/var"
fi
fi
dnl Fix "sysconfdir" variable if it hasn't been specified...
if test "$sysconfdir" = "\${prefix}/etc"; then
if test "$prefix" = "/"; then
sysconfdir="/etc"
else
sysconfdir="$prefix/etc"
fi
fi
dnl Fix "libdir" variable for IRIX 6.x...
if test "$libdir" = "\${exec_prefix}/lib"; then
libdir="$exec_prefix/lib"
fi
if test "$uname" = "IRIX" -a $uversion -ge 62; then
libdir="$exec_prefix/lib32"
fi
dnl Fix "fontpath" variable...
if test "x$fontpath" = "x"; then
fontpath="$datadir/cups/fonts"
fi
dnl Setup init.d locations...
if test x$rcdir = x; then
case "$uname" in
FreeBSD* | OpenBSD*)
# FreeBSD and OpenBSD
INITDIR=""
INITDDIR=""
;;
NetBSD*)
# NetBSD
INITDIR=""
INITDDIR="/etc/rc.d"
;;
Darwin*)
# Darwin and MacOS X...
INITDIR=""
INITDDIR="/System/Library/StartupItems/PrintingServices"
;;
Linux*)
# Linux seems to choose an init.d directory at random...
if test -d /sbin/init.d; then
# SuSE
INITDIR="/sbin/init.d"
INITDDIR=".."
else
if test -d /etc/rc.d; then
# RedHat
INITDIR="/etc/rc.d"
INITDDIR="../init.d"
else
# Others
INITDIR="/etc"
INITDDIR="../init.d"
fi
fi
;;
OSF1* | HP-UX*)
INITDIR="/sbin"
INITDDIR="../init.d"
;;
AIX*)
INITDIR="/etc/rc.d"
INITDDIR=".."
;;
*)
INITDIR="/etc"
INITDDIR="../init.d"
;;
esac
else
INITDIR=""
INITDDIR="$rcdir"
fi
AC_SUBST(INITDIR)
AC_SUBST(INITDDIR)
dnl Setup default locations...
CUPS_SERVERROOT="$sysconfdir/cups"
CUPS_REQUESTS="$localstatedir/spool/cups"
AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$sysconfdir/cups")
AC_DEFINE_UNQUOTED(CUPS_REQUESTS, "$localstatedir/spool/cups")
if test x$logdir = x; then
CUPS_LOGDIR="$localstatedir/log/cups"
AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$localstatedir/log/cups")
else
CUPS_LOGDIR="$logdir"
AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$logdir")
fi
dnl See what directory to put server executables...
case "$uname" in
*BSD* | Darwin*)
# *BSD and Darwin (MacOS X)
INSTALL_SYSV=""
CUPS_SERVERBIN="$exec_prefix/libexec/cups"
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$exec_prefix/libexec/cups")
;;
*)
# All others
INSTALL_SYSV="install-sysv"
CUPS_SERVERBIN="$libdir/cups"
AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$libdir/cups")
;;
esac
AC_SUBST(INSTALL_SYSV)
AC_SUBST(CUPS_SERVERROOT)
AC_SUBST(CUPS_SERVERBIN)
AC_SUBST(CUPS_LOGDIR)
AC_SUBST(CUPS_REQUESTS)
dnl Set the CUPS_LOCALE directory...
case "$uname" in
Linux* | *BSD* | Darwin*)
CUPS_LOCALEDIR="$datadir/locale"
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$datadir/locale")
;;
OSF1* | AIX*)
CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg"
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$exec_prefix/lib/nls/msg")
;;
*)
# This is the standard System V location...
CUPS_LOCALEDIR="$exec_prefix/lib/locale"
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$exec_prefix/lib/locale")
;;
esac
AC_SUBST(CUPS_LOCALEDIR)
dnl Set the CUPS_DATADIR directory...
CUPS_DATADIR="$datadir/cups"
AC_DEFINE_UNQUOTED(CUPS_DATADIR, "$datadir/cups")
AC_SUBST(CUPS_DATADIR)
dnl Set the CUPS_DOCROOT directory...
if test x$docdir = x; then
CUPS_DOCROOT="$datadir/doc/cups"
docdir="$datadir/doc/cups"
else
CUPS_DOCROOT="$docdir"
fi
AC_DEFINE_UNQUOTED(CUPS_DOCROOT, "$docdir")
AC_SUBST(CUPS_DOCROOT)
dnl Set the CUPS_FONTPATH directory...
CUPS_FONTPATH="$fontpath"
AC_SUBST(CUPS_FONTPATH)
AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$fontpath")
dnl
dnl End of "$Id: cups-directories.m4 3041 2002-12-17 19:00:27Z swdev $".
dnl
+82
Ver Arquivo
@@ -0,0 +1,82 @@
dnl
dnl "$Id: cups-image.m4 3041 2002-12-17 19:00:27Z swdev $"
dnl
dnl Image library stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
dnl Save the current libraries since we don't want the image libraries
dnl included with every program...
SAVELIBS="$LIBS"
dnl Check for image libraries...
LIBJPEG=""
LIBPNG=""
LIBTIFF=""
LIBZ=""
AC_SUBST(LIBJPEG)
AC_SUBST(LIBPNG)
AC_SUBST(LIBTIFF)
AC_SUBST(LIBZ)
AC_CHECK_HEADER(jpeglib.h,
AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,
AC_DEFINE(HAVE_LIBJPEG)
LIBJPEG="-ljpeg"
LIBS="$LIBS -ljpeg"))
AC_CHECK_HEADER(zlib.h,
AC_CHECK_LIB(z, gzgets,
AC_DEFINE(HAVE_LIBZ)
LIBZ="-lz"
LIBS="$LIBS -lz"))
dnl PNG library uses math library functions...
AC_CHECK_LIB(m, pow)
AC_CHECK_HEADER(png.h,
AC_CHECK_LIB(png, png_set_tRNS_to_alpha,
AC_DEFINE(HAVE_LIBPNG)
LIBPNG="-lpng -lm"))
AC_CHECK_HEADER(tiff.h,
AC_CHECK_LIB(tiff, TIFFReadScanline,
AC_DEFINE(HAVE_LIBTIFF)
LIBTIFF="-ltiff"))
dnl Restore original LIBS settings...
LIBS="$SAVELIBS"
EXPORT_LIBJPEG="$LIBJPEG"
EXPORT_LIBPNG="$LIBPNG"
EXPORT_LIBTIFF="$LIBTIFF"
EXPORT_LIBZ="$LIBZ"
AC_SUBST(EXPORT_LIBJPEG)
AC_SUBST(EXPORT_LIBPNG)
AC_SUBST(EXPORT_LIBTIFF)
AC_SUBST(EXPORT_LIBZ)
AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H))
dnl
dnl End of "$Id: cups-image.m4 3041 2002-12-17 19:00:27Z swdev $".
dnl
+49
Ver Arquivo
@@ -0,0 +1,49 @@
dnl
dnl "$Id: cups-libtool.m4 3041 2002-12-17 19:00:27Z swdev $"
dnl
dnl Libtool stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported=LIBTOOL_PATH
turn on building with libtool (UNSUPPORTED!), default=no],
[if test x$enable_libtool_unsupported != xno; then
LIBTOOL="$enable_libtool_unsupported"
enable_shared=no
echo "WARNING: libtool is not supported or endorsed by Easy Software Products."
echo " WE DO NOT PROVIDE TECHNICAL SUPPORT FOR LIBTOOL PROBLEMS."
echo " (even if you have a support contract)"
else
LIBTOOL=""
fi])
AC_SUBST(LIBTOOL)
if test x$LIBTOOL != x; then
LIBCUPS="libcups.la"
LIBCUPSIMAGE="libcupsimage.la"
LINKCUPS="../cups/\$(LIBCUPS)"
LINKCUPSIMAGE="../filter/\$(LIBCUPSIMAGE)"
DSO="\$(CC)"
fi
dnl
dnl End of "$Id: cups-libtool.m4 3041 2002-12-17 19:00:27Z swdev $".
dnl
+104
Ver Arquivo
@@ -0,0 +1,104 @@
dnl
dnl "$Id: cups-manpages.m4 3041 2002-12-17 19:00:27Z swdev $"
dnl
dnl Manpage stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
dnl Fix "mandir" variable...
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then
case "$uname" in
Darwin* | Linux* | *BSD* | AIX*)
# Darwin, MacOS X, Linux, *BSD, and AIX
mandir="/usr/share/man"
AMANDIR="/usr/share/man"
PMANDIR="/usr/share/man"
;;
IRIX*)
# SGI IRIX
mandir="/usr/share/catman/u_man"
AMANDIR="/usr/share/catman/a_man"
PMANDIR="/usr/share/catman/p_man"
;;
*)
# All others
mandir="/usr/man"
AMANDIR="/usr/man"
PMANDIR="/usr/man"
;;
esac
else
AMANDIR="$mandir"
PMANDIR="$mandir"
fi
AC_SUBST(AMANDIR)
AC_SUBST(PMANDIR)
dnl Setup manpage extensions...
case "$uname" in
*BSD* | Darwin*)
# *BSD
CAT1EXT=0
CAT3EXT=0
CAT5EXT=0
CAT8EXT=0
MAN8EXT=8
MAN8DIR=8
;;
IRIX*)
# SGI IRIX
CAT1EXT=z
CAT3EXT=z
CAT5EXT=z
CAT8EXT=z
MAN8EXT=1m
MAN8DIR=1
;;
SunOS* | HP-UX*)
# Solaris and HP-UX
CAT1EXT=1
CAT3EXT=3
CAT5EXT=5
CAT8EXT=1m
MAN8EXT=1m
MAN8DIR=1m
;;
*)
# All others
CAT1EXT=1
CAT3EXT=3
CAT5EXT=5
CAT8EXT=8
MAN8EXT=8
MAN8DIR=8
;;
esac
AC_SUBST(CAT1EXT)
AC_SUBST(CAT3EXT)
AC_SUBST(CAT5EXT)
AC_SUBST(CAT8EXT)
AC_SUBST(MAN8EXT)
AC_SUBST(MAN8DIR)
dnl
dnl End of "$Id: cups-manpages.m4 3041 2002-12-17 19:00:27Z swdev $".
dnl
+59
Ver Arquivo
@@ -0,0 +1,59 @@
dnl
dnl "$Id: cups-network.m4 3888 2003-08-28 15:16:08Z mike $"
dnl
dnl Networking stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
NETLIBS=""
if test "$uname" != "IRIX"; then
AC_CHECK_LIB(socket,socket,NETLIBS="-lsocket")
AC_CHECK_LIB(nsl,gethostbyaddr,NETLIBS="$NETLIBS -lnsl")
fi
AC_CHECK_FUNCS(rresvport getifaddrs hstrerror)
AC_CHECK_MEMBER(struct sockaddr.sa_len,,,[#include <sys/socket.h>])
AC_CHECK_HEADER(sys/sockio.h,AC_DEFINE(HAVE_SYS_SOCKIO_H))
AC_SUBST(NETLIBS)
if test "$uname" = "SunOS"; then
case "$uversion" in
55* | 56*)
maxfiles=1024
;;
*)
maxfiles=4096
;;
esac
else
maxfiles=4096
fi
AC_ARG_WITH(maxfiles, [ --with-maxfiles=N set maximum number of file descriptors for scheduler ],
maxfiles=$withval)
AC_DEFINE_UNQUOTED(CUPS_MAX_FDS, $maxfiles)
dnl
dnl End of "$Id: cups-network.m4 3888 2003-08-28 15:16:08Z mike $".
dnl
+48
Ver Arquivo
@@ -0,0 +1,48 @@
dnl
dnl "$Id: cups-openslp.m4 3041 2002-12-17 19:00:27Z swdev $"
dnl
dnl OpenSLP configuration stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
AC_ARG_ENABLE(slp, [ --enable-slp turn on SLP support, default=yes])
AC_ARG_WITH(openslp-libs, [ --with-openslp-libs set directory for OpenSLP library],
LDFLAGS="-L$withval $LDFLAGS"
DSOFLAGS="-L$withval $DSOFLAGS",)
AC_ARG_WITH(openslp-includes, [ --with-openslp-includes set directory for OpenSLP includes],
CFLAGS="-I$withval $CFLAGS"
CXXFLAGS="-I$withval $CXXFLAGS"
CPPFLAGS="-I$withval $CPPFLAGS",)
LIBSLP=""
if test x$enable_slp != xno; then
AC_CHECK_HEADER(slp.h,
AC_CHECK_LIB(slp, SLPOpen,
AC_DEFINE(HAVE_LIBSLP)
LIBSLP="-lslp"))
fi
AC_SUBST(LIBSLP)
dnl
dnl End of "$Id: cups-openslp.m4 3041 2002-12-17 19:00:27Z swdev $".
dnl
+112
Ver Arquivo
@@ -0,0 +1,112 @@
dnl
dnl "$Id: cups-openssl.m4 3940 2003-09-17 19:35:22Z mike $"
dnl
dnl OpenSSL/GNUTLS stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
AC_ARG_ENABLE(ssl, [ --enable-ssl turn on SSL/TLS support, default=yes])
AC_ARG_ENABLE(openssl, [ --enable-openssl use OpenSSL for SSL/TLS support, default=yes])
AC_ARG_ENABLE(gnutls, [ --enable-gnutls use GNU TLS for SSL/TLS support, default=yes])
AC_ARG_ENABLE(cdsassl, [ --enable-cdsassl use CDSA for SSL/TLS support, default=yes])
AC_ARG_WITH(openssl-libs, [ --with-openssl-libs set directory for OpenSSL library],
LDFLAGS="-L$withval $LDFLAGS"
DSOFLAGS="-L$withval $DSOFLAGS",)
AC_ARG_WITH(openssl-includes, [ --with-openssl-includes set directory for OpenSSL includes],
CFLAGS="-I$withval $CFLAGS"
CXXFLAGS="-I$withval $CXXFLAGS"
CPPFLAGS="-I$withval $CPPFLAGS",)
SSLFLAGS=""
SSLLIBS=""
if test x$enable_ssl != xno; then
dnl Check for the OpenSSL library first, which has precedence over
dnl CDSA and GNUTLS...
if test "x${SSLLIBS}" = "x" -a "x${enable_openssl}" != "xno"; then
AC_CHECK_HEADER(openssl/ssl.h,
dnl Save the current libraries so the crypto stuff isn't always
dnl included...
SAVELIBS="$LIBS"
dnl Some ELF systems can't resolve all the symbols in libcrypto
dnl if libcrypto was linked against RSAREF, and fail to link the
dnl test program correctly, even though a correct installation
dnl of OpenSSL exists. So we test the linking three times in
dnl case the RSAREF libraries are needed.
for libcrypto in \
"-lcrypto" \
"-lcrypto -lrsaref" \
"-lcrypto -lRSAglue -lrsaref"
do
AC_CHECK_LIB(ssl,SSL_new,
[SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
SSLLIBS="-lssl $libcrypto"
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_LIBSSL)],,
$libcrypto)
if test "x${SSLLIBS}" != "x"; then
break
fi
done
LIBS="$SAVELIBS")
fi
dnl If OpenSSL wasn't found, look for CDSA...
if test "x${SSLLIBS}" = "x" -a "x${enable_cdsassl}" != "xno"; then
if test $uname = Darwin; then
AC_CHECK_HEADER(Security/SecureTransport.h,
[SSLLIBS="-framework CoreFoundation -framework Security"
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_CDSASSL)])
fi
fi
dnl Then look for GNU TLS...
if test "x${SSLLIBS}" = "x" -a "x${enable_gnutls}" != "xno"; then
AC_CHECK_HEADER(gnutls/gnutls.h,
dnl Save the current libraries so the crypto stuff isn't always
dnl included...
SAVELIBS="$LIBS"
TEST_GNUTLS_LIBS=`libgnutls-config --libs`
AC_CHECK_LIB(gnutls, gnutls_init,
[SSLLIBS=$TEST_GNUTLS_LIBS
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_GNUTLS)],,
$TEST_GNUTLS_LIBS)
LIBS="$SAVELIBS")
fi
fi
AC_SUBST(SSLFLAGS)
AC_SUBST(SSLLIBS)
EXPORT_SSLLIBS="$SSLLIBS"
AC_SUBST(EXPORT_SSLLIBS)
dnl
dnl End of "$Id: cups-openssl.m4 3940 2003-09-17 19:35:22Z mike $".
dnl
+91
Ver Arquivo
@@ -0,0 +1,91 @@
dnl
dnl "$Id: cups-opsys.m4 3929 2003-09-15 20:32:12Z mike $"
dnl
dnl Operating system stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
dnl Get the operating system and version number...
uname=`uname`
uversion=`uname -r | sed -e '1,$s/[[^0-9]]//g'`
if test x$uname = xIRIX64; then
uname="IRIX"
fi
dnl Determine the correct username and group for this OS...
AC_ARG_WITH(cups-user, [ --with-cups-user set default user for CUPS],
CUPS_USER="$withval",
AC_MSG_CHECKING(for default print user)
if test -f /etc/passwd; then
CUPS_USER=""
for user in lp lpd guest daemon nobody; do
if test "`grep \^${user}: /etc/passwd`" != ""; then
CUPS_USER="$user"
AC_MSG_RESULT($user)
break;
fi
done
if test x$CUPS_USER = x; then
CUPS_USER="${USER:=nobody}"
AC_MSG_RESULT(not found, using "$CUPS_USER")
fi
else
CUPS_USER="${USER:=nobody}"
AC_MSG_RESULT(no password file, using "$CUPS_USER")
fi)
AC_ARG_WITH(cups-group, [ --with-cups-group set default group for CUPS],
CUPS_GROUP="$withval",
AC_MSG_CHECKING(for default print group)
if test -f /etc/group; then
if test x$uname = xDarwin; then
GROUP_LIST="lp admin"
else
GROUP_LIST="sys system root"
fi
CUPS_GROUP=""
for group in $GROUP_LIST; do
if test "`grep \^${group}: /etc/group`" != ""; then
CUPS_GROUP="$group"
AC_MSG_RESULT($group)
break;
fi
done
if test x$CUPS_GROUP = x; then
CUPS_GROUP="${GROUP:=nobody}"
AC_MSG_RESULT(not found, using "$CUPS_GROUP")
fi
else
CUPS_GROUP="${GROUP:=nobody}"
AC_MSG_RESULT(no group file, using "$CUPS_GROUP")
fi)
AC_SUBST(CUPS_USER)
AC_SUBST(CUPS_GROUP)
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USER, "$CUPS_USER")
AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GROUP, "$CUPS_GROUP")
dnl
dnl "$Id: cups-opsys.m4 3929 2003-09-15 20:32:12Z mike $"
dnl
+71
Ver Arquivo
@@ -0,0 +1,71 @@
dnl
dnl "$Id: cups-pam.m4 3041 2002-12-17 19:00:27Z swdev $"
dnl
dnl PAM stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
AC_ARG_ENABLE(pam, [ --enable-pam turn on PAM support, default=yes])
dnl Don't use PAM with AIX...
if test $uname = AIX; then
enable_pam=no
fi
PAMDIR=""
PAMLIBS=""
PAMMOD="pam_unknown.so"
if test x$enable_pam != xno; then
SAVELIBS="$LIBS"
AC_CHECK_LIB(dl,dlopen)
AC_CHECK_LIB(pam,pam_start)
AC_CHECK_HEADER(pam/pam_appl.h,AC_DEFINE(HAVE_PAM_PAM_APPL_H))
if test x$ac_cv_lib_pam_pam_start != xno; then
if test x$ac_cv_lib_dl_dlopen != xno; then
PAMLIBS="-lpam -ldl"
else
PAMLIBS="-lpam"
fi
if test -d /etc/pam.d; then
PAMDIR="/etc/pam.d"
fi
fi
LIBS="$SAVELIBS"
# This test might need to be updated as Linux distributors move
# things around...
for mod in pam_unix2.so pam_unix.so pam_pwdb.so; do
if test -f /lib/security/$mod; then
PAMMOD="$mod"
fi
done
fi
AC_SUBST(PAMDIR)
AC_SUBST(PAMLIBS)
AC_SUBST(PAMMOD)
dnl
dnl End of "$Id: cups-pam.m4 3041 2002-12-17 19:00:27Z swdev $".
dnl
+91
Ver Arquivo
@@ -0,0 +1,91 @@
dnl
dnl "$Id: cups-scripting.m4 3472 2003-03-14 17:04:09Z mike $"
dnl
dnl Scripting configuration stuff for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
dnl Do we have Java?
AC_ARG_WITH(java, [ --with-java set Java interpreter for web interfaces ],
CUPS_JAVA="$withval",
CUPS_JAVA="")
if test "x$CUPS_JAVA" = x; then
AC_PATH_PROG(JAVA,java)
CUPS_JAVA="$JAVA"
fi
AC_DEFINE_UNQUOTED(CUPS_JAVA, "$CUPS_JAVA")
if test "x$CUPS_JAVA" != x; then
AC_DEFINE(HAVE_JAVA)
fi
dnl Do we have Perl?
AC_ARG_WITH(perl, [ --with-perl set Perl interpreter for web interfaces ],
CUPS_PERL="$withval",
CUPS_PERL="")
if test "x$CUPS_PERL" = x; then
AC_PATH_PROG(PERL,perl)
CUPS_PERL="$PERL"
fi
AC_DEFINE_UNQUOTED(CUPS_PERL, "$CUPS_PERL")
if test "x$CUPS_PERL" != x; then
AC_DEFINE(HAVE_PERL)
fi
dnl Do we have PHP?
AC_ARG_WITH(php, [ --with-php set PHP interpreter for web interfaces ],
CUPS_PHP="$withval",
CUPS_PHP="")
if test "x$CUPS_PHP" = x; then
AC_PATH_PROG(PHP,php)
CUPS_PHP="$PHP"
fi
AC_DEFINE_UNQUOTED(CUPS_PHP, "$CUPS_PHP")
if test "x$CUPS_PHP" != x; then
AC_DEFINE(HAVE_PHP)
fi
dnl Do we have Python?
AC_ARG_WITH(python, [ --with-python set Python interpreter for web interfaces ],
CUPS_PYTHON="$withval",
CUPS_PYTHON="")
if test "x$CUPS_PYTHON" = x; then
AC_PATH_PROG(PYTHON,python)
CUPS_PYTHON="$PYTHON"
fi
AC_DEFINE_UNQUOTED(CUPS_PYTHON, "$CUPS_PYTHON")
if test "x$CUPS_PYTHON" != x; then
AC_DEFINE(HAVE_PYTHON)
fi
dnl
dnl End of "$Id: cups-scripting.m4 3472 2003-03-14 17:04:09Z mike $".
dnl
+156
Ver Arquivo
@@ -0,0 +1,156 @@
dnl
dnl "$Id: cups-sharedlibs.m4 3826 2003-07-23 20:07:35Z mike $"
dnl
dnl Shared library support for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
dnl copyright law. Distribution and use rights are outlined in the file
dnl "LICENSE.txt" which should have been included with this file. If this
dnl file is missing or damaged please contact Easy Software Products
dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
dnl EMail: cups-info@cups.org
dnl WWW: http://www.cups.org
dnl
PICFLAG=1
DSOFLAGS="${DSOFLAGS:=}"
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries, default=yes])
if test x$enable_shared != xno; then
case "$uname" in
SunOS* | UNIX_S*)
LIBCUPS="libcups.so.2"
LIBCUPSIMAGE="libcupsimage.so.2"
DSO="\$(CC)"
DSOFLAGS="$DSOFLAGS -Wl,-h,\$@ -G \$(OPTIM)"
;;
HP-UX*)
LIBCUPS="libcups.sl.2"
LIBCUPSIMAGE="libcupsimage.sl.2"
DSO="ld"
DSOFLAGS="$DSOFLAGS -b -z +h \$@"
;;
IRIX*)
LIBCUPS="libcups.so.2"
LIBCUPSIMAGE="libcupsimage.so.2"
DSO="\$(CC)"
DSOFLAGS="$DSOFLAGS -Wl,-rpath,\$(libdir),-set_version,sgi2.5,-soname,\$@ -shared \$(OPTIM)"
;;
OSF1* | Linux* | *BSD*)
LIBCUPS="libcups.so.2"
LIBCUPSIMAGE="libcupsimage.so.2"
DSO="\$(CC)"
DSOFLAGS="$DSOFLAGS -Wl,-soname,\$@ -shared \$(OPTIM)"
;;
Darwin*)
LIBCUPS="libcups.2.dylib"
LIBCUPSIMAGE="libcupsimage.2.dylib"
DSO="\$(CC)"
DSOFLAGS="$DSOFLAGS \$(RC_CFLAGS) -dynamiclib -lc"
;;
AIX*)
LIBCUPS="libcups_s.a"
LIBCUPSIMAGE="libcupsimage_s.a"
DSO="\$(CC)"
DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)"
;;
*)
echo "Warning: shared libraries may not be supported. Trying -shared"
echo " option with compiler."
LIBCUPS="libcups.so.2"
LIBCUPSIMAGE="libcupsimage.so.2"
DSO="\$(CC)"
DSOFLAGS="$DSOFLAGS -Wl,-soname,\$@ -shared \$(OPTIM)"
;;
esac
else
PICFLAG=0
LIBCUPS="libcups.a"
LIBCUPSIMAGE="libcupsimage.a"
DSO=":"
fi
AC_SUBST(DSO)
AC_SUBST(DSOFLAGS)
AC_SUBST(LIBCUPS)
AC_SUBST(LIBCUPSIMAGE)
if test x$enable_shared = xno; then
LINKCUPS="../cups/libcups.a \$(SSLLIBS)"
LINKCUPSIMAGE="../filter/libcupsimage.a"
else
if test $uname = AIX; then
LINKCUPS="-lcups_s"
LINKCUPSIMAGE="-lcupsimage_s"
else
LINKCUPS="-lcups"
LINKCUPSIMAGE="-lcupsimage"
fi
fi
AC_SUBST(LINKCUPS)
AC_SUBST(LINKCUPSIMAGE)
dnl Update libraries for DSOs...
EXPORT_LDFLAGS=""
if test "$DSO" != ":"; then
# When using DSOs the image libraries are linked to libcupsimage.so
# rather than to the executables. This makes things smaller if you
# are using any static libraries, and it also allows us to distribute
# a single DSO rather than a bunch...
DSOLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)"
IMGLIBS=""
# The *BSD, HP-UX, and Solaris run-time linkers need help when
# deciding where to find a DSO. Add linker options to tell them
# where to find the DSO (usually in /usr/lib... duh!)
case $uname in
HP-UX*)
# HP-UX
DSOFLAGS="+s +b $libdir $DSOFLAGS"
LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir"
EXPORT_LDFLAGS="-Wl,+s,+b,$libdir"
;;
SunOS*)
# Solaris
DSOFLAGS="-R$libdir $DSOFLAGS"
LDFLAGS="$LDFLAGS -R$libdir"
EXPORT_LDFLAGS="-R$libdir"
;;
*BSD*)
# *BSD
DSOFLAGS="-Wl,-R$libdir $DSOFLAGS"
LDFLAGS="$LDFLAGS -Wl,-R$libdir"
EXPORT_LDFLAGS="-Wl,-R$libdir"
;;
Linux*)
# Linux
DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS"
LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
EXPORT_LDFLAGS="-Wl,-rpath,$libdir"
;;
esac
else
DSOLIBS=""
IMGLIBS="\$(LIBPNG) \$(LIBTIFF) \$(LIBJPEG) \$(LIBZ)"
fi
AC_SUBST(DSOLIBS)
AC_SUBST(IMGLIBS)
AC_SUBST(EXPORT_LDFLAGS)
dnl
dnl End of "$Id: cups-sharedlibs.m4 3826 2003-07-23 20:07:35Z mike $".
dnl
+189 -7
Ver Arquivo
@@ -5,7 +5,7 @@
*
* @configure_input@
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -16,27 +16,59 @@
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44145 Airport View Drive, Suite 204
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* Voice: (301) 373-9600
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_CONFIG_H_
#define _CUPS_CONFIG_H_
/*
* Version of software...
*/
#define CUPS_SVERSION "CUPS v1.0"
#define CUPS_SVERSION "CUPS v1.1.19rc3"
/*
* Default user and group...
*/
#define CUPS_DEFAULT_USER "lp"
#define CUPS_DEFAULT_GROUP "sys"
/*
* Maximum number of file descriptors to support.
*/
#define CUPS_MAX_FDS 4096
/*
* Where are files stored?
*/
#define CUPS_LOCALEDIR "/usr/lib/locale"
#define CUPS_SERVERROOT "/var/cups"
#define CUPS_DATADIR "/usr/share/cups"
#define CUPS_LOCALEDIR "/usr/share/locale"
#define CUPS_SERVERROOT "/etc/cups"
#define CUPS_SERVERBIN "/usr/lib/cups"
#define CUPS_DOCROOT "/usr/share/doc/cups"
#define CUPS_REQUESTS "/var/spool/cups"
#define CUPS_LOGDIR "/var/logs/cups"
#define CUPS_DATADIR "/usr/share/cups"
#define CUPS_FONTPATH "/usr/share/cups/fonts"
/*
* What is the format string for strftime?
*/
#define CUPS_STRFTIME_FORMAT NULL
/*
* Do we have various image libraries?
@@ -47,12 +79,14 @@
#undef HAVE_LIBJPEG
#undef HAVE_LIBTIFF
/*
* Does this machine store words in big-endian (MSB-first) order?
*/
#undef WORDS_BIGENDIAN
/*
* Which directory functions and headers do we use?
*/
@@ -62,18 +96,41 @@
#undef HAVE_SYS_NDIR_H
#undef HAVE_NDIR_H
/*
* Do we have PAM stuff?
*/
#ifndef HAVE_LIBPAM
#define HAVE_LIBPAM 0
#endif /* !HAVE_LIBPAM */
#undef HAVE_PAM_PAM_APPL_H
/*
* Do we have <shadow.h>?
*/
#undef HAVE_SHADOW_H
/*
* Do we have <crypt.h>?
*/
#undef HAVE_CRYPT_H
/*
* Use <string.h>, <strings.h>, and/or <bstring.h>?
*/
#undef HAVE_STRING_H
#undef HAVE_STRINGS_H
#undef HAVE_BSTRING_H
/*
* Do we have the strXXX() functions?
*/
@@ -81,6 +138,24 @@
#undef HAVE_STRDUP
#undef HAVE_STRCASECMP
#undef HAVE_STRNCASECMP
#undef HAVE_STRLCAT
#undef HAVE_STRLCPY
/*
* Do we have the vsyslog() function?
*/
#undef HAVE_VSYSLOG
/*
* Do we have the (v)snprintf() functions?
*/
#undef HAVE_SNPRINTF
#undef HAVE_VSNPRINTF
/*
* What signal functions to use?
@@ -89,6 +164,7 @@
#undef HAVE_SIGSET
#undef HAVE_SIGACTION
/*
* What wait functions to use?
*/
@@ -96,6 +172,112 @@
#undef HAVE_WAITPID
#undef HAVE_WAIT3
/*
* Do we have the mallinfo function and malloc.h?
*/
#undef HAVE_MALLINFO
#undef HAVE_MALLOC_H
/*
* Which encryption libraries do we have?
*/
#undef HAVE_CDSASSL
#undef HAVE_GNUTLS
#undef HAVE_LIBSSL
#undef HAVE_SSL
/*
* Do we have the OpenSLP library?
*/
#undef HAVE_LIBSLP
/*
* Do we have libpaper?
*/
#undef HAVE_LIBPAPER
/*
* Do we have <sys/ioctl.h>?
*/
#undef HAVE_SYS_IOCTL_H
/*
* Do we have mkstemp() and/or mkstemps()?
*/
#undef HAVE_MKSTEMP
#undef HAVE_MKSTEMPS
/*
* Does the "tm" structure contain the "tm_gmtoff" member?
*/
#undef HAVE_TM_GMTOFF
/*
* Do we have rresvport()?
*/
#undef HAVE_RRESVPORT
/*
* Do we have getifaddrs()?
*/
#undef HAVE_GETIFADDRS
/*
* Do we have hstrerror()?
*/
#undef HAVE_HSTRERROR
/*
* Do we have the <sys/sockio.h> header file?
*/
#undef HAVE_SYS_SOCKIO_H
/*
* Does the sockaddr structure contain an sa_len parameter?
*/
#undef HAVE_STRUCT_SOCKADDR_SA_LEN
/*
* Various scripting languages...
*/
#undef HAVE_JAVA
#define CUPS_JAVA "/usr/bin/java"
#undef HAVE_PERL
#define CUPS_PERL "/usr/bin/perl"
#undef HAVE_PHP
#define CUPS_PHP "/usr/bin/php"
#undef HAVE_PYTHON
#define CUPS_PYTHON "/usr/bin/python"
#endif /* !_CUPS_CONFIG_H_ */
/*
* End of "$Id$".
*/
+17 -106
Ver Arquivo
@@ -3,7 +3,7 @@ dnl "$Id$"
dnl
dnl Configuration script for the Common UNIX Printing System (CUPS).
dnl
dnl Copyright 1997-1999 by Easy Software Products, all rights reserved.
dnl Copyright 1997-2003 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
@@ -14,7 +14,7 @@ dnl at:
dnl
dnl Attn: CUPS Licensing Information
dnl Easy Software Products
dnl 44145 Airport View Drive, Suite 204
dnl 44141 Airport View Drive, Suite 204
dnl Hollywood, Maryland 20636-3111 USA
dnl
dnl Voice: (301) 373-9603
@@ -23,116 +23,27 @@ dnl WWW: http://www.cups.org
dnl
AC_INIT(cups/cups.h)
AC_CONFIG_HEADER(config.h)
AC_PREFIX_DEFAULT(/usr)
dnl Clear default debugging options and set normal optimization by
dnl default unless the user asks for debugging specifically.
sinclude(config-scripts/cups-opsys.m4)
sinclude(config-scripts/cups-common.m4)
sinclude(config-scripts/cups-directories.m4)
sinclude(config-scripts/cups-manpages.m4)
CFLAGS="${CFLAGS:=}"
CXXFLAGS="${CXXFLAGS:=}"
OPTIM="-O"
AC_SUBST(OPTIM)
sinclude(config-scripts/cups-sharedlibs.m4)
sinclude(config-scripts/cups-libtool.m4)
sinclude(config-scripts/cups-compiler.m4)
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]],
if eval "test x$enable_debug = xyes"; then
OPTIM="-g"
fi)
sinclude(config-scripts/cups-image.m4)
sinclude(config-scripts/cups-network.m4)
sinclude(config-scripts/cups-openslp.m4)
sinclude(config-scripts/cups-openssl.m4)
sinclude(config-scripts/cups-pam.m4)
dnl Checks for programs...
AC_PROG_AWK
AC_PROG_CC
AC_PROG_CPP
AC_PROG_RANLIB
AC_PATH_PROG(AR,ar)
AC_PATH_PROG(CP,cp)
AC_PATH_PROG(MKDIR,mkdir)
AC_PATH_PROG(RM,rm)
AC_PATH_PROG(GROFF,groff)
AC_PATH_PROG(HTMLDOC,htmldoc)
sinclude(config-scripts/cups-scripting.m4)
dnl Architecture checks...
AC_C_BIGENDIAN
uname=`uname`
if test "$uname" = "IRIX64"; then
uname=IRIX
fi
AC_OUTPUT(Makedefs cups.list cups.sh cups-config conf/cupsd.conf conf/pam.conf)
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)
AC_CHECK_LIB(socket,socket,
if test "$uname" != "IRIX"; then
LIBS="$LIBS -lsocket"
else
echo "Not using -lsocket since you are running IRIX."
fi)
AC_CHECK_LIB(nsl,gethostbyaddr,
if test "$uname" != "IRIX"; then
LIBS="$LIBS -lnsl"
else
echo "Not using -lnsl since you are running IRIX."
fi)
IMGLIBS=""
AC_SUBST(IMGLIBS)
AC_CHECK_HEADER(jpeglib.h,
AC_DEFINE(HAVE_LIBJPEG)
IMGLIBS="$IMGLIBS -ljpeg")
AC_CHECK_HEADER(zlib.h,
AC_DEFINE(HAVE_LIBZ)
IMGLIBS="$IMGLIBS -lz")
AC_CHECK_HEADER(png.h,
AC_DEFINE(HAVE_LIBPNG)
IMGLIBS="$IMGLIBS -lpng")
AC_CHECK_HEADER(tiff.h,
AC_DEFINE(HAVE_LIBTIFF)
IMGLIBS="$IMGLIBS -ltiff")
dnl Checks for header files.
AC_HEADER_STDC
AC_HEADER_DIRENT
AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H))
dnl Checks for string functions.
AC_CHECK_FUNCS(strdup)
AC_CHECK_FUNCS(strcasecmp)
AC_CHECK_FUNCS(strncasecmp)
dnl Checks for signal functions.
AC_CHECK_FUNCS(sigset)
AC_CHECK_FUNCS(sigaction)
dnl Checks for wait functions.
AC_CHECK_FUNCS(waitpid)
AC_CHECK_FUNCS(wait3)
dnl Fix "prefix" variable if it hasn't been specified...
if test "$prefix" = "NONE"; then
prefix="/usr"
fi
dnl CUPS_SERVERROOT needs special attention for the default location...
if test "$prefix" = "/usr"; then
CUPS_SERVERROOT="/var/cups"
else
CUPS_SERVERROOT="$prefix/var/cups"
fi
AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$CUPS_SERVERROOT")
AC_SUBST(CUPS_SERVERROOT)
dnl Set the CUPS_LOCALE directory...
CUPS_LOCALEDIR="$prefix/lib/locale"
AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR")
AC_SUBST(CUPS_LOCALEDIR)
dnl Set the CUPS_DATAFILE directory...
CUPS_DATADIR="$prefix/share/cups"
AC_DEFINE_UNQUOTED(CUPS_DATADIR, "$CUPS_DATADIR")
AC_SUBST(CUPS_DATADIR)
AC_OUTPUT(Makedefs)
chmod +x cups-config
dnl
dnl End of "$Id$".
Arquivo executável
+134
Ver Arquivo
@@ -0,0 +1,134 @@
#!/bin/sh
#
# "$Id$"
#
# CUPS configuration utility.
#
# Copyright 2001-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# 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
#
VERSION="@CUPS_VERSION@"
APIVERSION="1.1"
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
includedir=@includedir@
libdir=@libdir@
datadir=@datadir@
sysconfdir=@sysconfdir@
cups_datadir=@CUPS_DATADIR@
cups_serverbin=@CUPS_SERVERBIN@
cups_serverroot=@CUPS_SERVERROOT@
# flags for C++ compiler:
CFLAGS=""
LDFLAGS="@EXPORT_LDFLAGS@"
LIBS="@EXPORT_SSLLIBS@ @NETLIBS@ @COMMONLIBS@"
IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@ @EXPORT_LIBZ@"
if test $includedir != /usr/include; then
CFLAGS="$CFLAGS -I$includedir"
fi
if test $libdir != /usr/lib -a $libdir != /usr/lib32; then
LDFLAGS="$LDFLAGS -L$libdir"
fi
usage ()
{
echo "Usage: cups-config --api-version"
echo " cups-config --cflags"
echo " cups-config --datadir"
echo " cups-config --help"
echo " cups-config --ldflags"
echo " cups-config [--image] [--static] --libs"
echo " cups-config --serverbin"
echo " cups-config --serverroot"
echo " cups-config --version"
exit $1
}
if test $# -eq 0; then
usage 1
fi
# Parse command line options
static=no
image=no
while test $# -gt 0; do
case $1 in
--api-version)
echo $APIVERSION
;;
--cflags)
echo $CFLAGS
;;
--datadir)
echo $cups_datadir
;;
--help)
usage 0
;;
--image)
image=yes
;;
--ldflags)
echo $LDFLAGS
;;
--libs)
if test $static = no; then
if test $image = no; then
echo -lcups $LIBS
else
echo -lcupsimage $IMGLIBS -lcups $LIBS
fi
else
if test $image = no; then
echo $libdir/libcups.a $LIBS
else
echo $libdir/libcupsimage.a $IMGLIBS $libdir/libcups.a $LIBS
fi
fi
;;
--serverbin)
echo $cups_serverbin
;;
--serverroot)
echo $cups_serverroot
;;
--static)
static=yes
;;
--version)
echo $VERSION
;;
*)
usage 1
;;
esac
shift
done
#
# End of "$Id$".
#
+1 -85
Ver Arquivo
@@ -3,7 +3,7 @@ Microsoft Developer Studio Workspace File, Format Version 6.00
###############################################################################
Project: "cups"=.\cups\cups.dsp - Package Owner=<4>
Project: "cups"=".\cups\cups.dsp" - Package Owner=<4>
Package=<5>
{{{
@@ -15,90 +15,6 @@ Package=<4>
###############################################################################
Project: "hpgltops"=.\filter\hpgltops.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name cups
End Project Dependency
}}}
###############################################################################
Project: "image"=.\filter\image.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "pstops"=.\filter\pstops.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "testmime"=.\cups\testmime.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name cups
End Project Dependency
}}}
###############################################################################
Project: "testppd"=.\cups\testppd.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name cups
End Project Dependency
}}}
###############################################################################
Project: "texttops"=.\filter\texttops.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name cups
End Project Dependency
}}}
###############################################################################
Global:
Package=<5>
+506
Ver Arquivo
@@ -0,0 +1,506 @@
#
# "$Id$"
#
# ESP Package Manager (EPM) file list for the Common UNIX Printing
# System (CUPS).
#
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
# Product information
%product Common UNIX Printing System
%copyright 1993-2003 by Easy Software Products, All Rights Reserved.
%vendor Easy Software Products
%license LICENSE.txt
%readme README.txt
%version @CUPS_VERSION@
%description The Common UNIX Printing System provides a portable printing
%description layer for UNIX® operating systems. It has been developed by
%description Easy Software Products to promote a standard printing solution
%description for all UNIX vendors and users. CUPS provides the System V and
%description Berkeley command-line interfaces.
%provides cups-devel
%provides cups-libs
%provides cupsys
%provides cupsys-bsd
%provides cupsys-client
%provides cupsys-devel
%provides libcups1
%provides libcupsys2
%provides libcupsys2-dev
%format rpm deb portable
%provides @LIBCUPS@
%provides @LIBCUPSIMAGE@
%format all
#
# GNU variables...
#
$prefix=@prefix@
$exec_prefix=@exec_prefix@
$bindir=@bindir@
$datadir=@datadir@
$includedir=@includedir@
$infodir=@infodir@
$libdir=@libdir@
$libexecdir=@libexecdir@
$localstatedir=@localstatedir@
$mandir=@mandir@
$oldincludedir=@oldincludedir@
$sbindir=@sbindir@
$sharedstatedir=@sharedstatedir@
$srcdir=@srcdir@
$sysconfdir=@sysconfdir@
$top_srcdir=@top_srcdir@
#
# ESP variables...
#
$AMANDIR=@AMANDIR@
$BINDIR=@bindir@
$DATADIR=@CUPS_DATADIR@
$DOCDIR=@CUPS_DOCROOT@
$INCLUDEDIR=${includedir}
$INITDIR=@INITDIR@
$INITDDIR=@INITDDIR@
$LIBDIR=${libdir}
$LOCALEDIR=@CUPS_LOCALEDIR@
$LOGDIR=@CUPS_LOGDIR@
$MANDIR=@mandir@
$PAMDIR=@PAMDIR@
$PMANDIR=@PMANDIR@
$REQUESTS=@CUPS_REQUESTS@
$SBINDIR=@sbindir@
$SERVERBIN=@CUPS_SERVERBIN@
$SERVERROOT=@CUPS_SERVERROOT@
$CUPS_USER=@CUPS_USER@
$CUPS_GROUP=@CUPS_GROUP@
$CAT1EXT=@CAT1EXT@
$CAT3EXT=@CAT3EXT@
$CAT5EXT=@CAT5EXT@
$CAT8EXT=@CAT8EXT@
$MAN8EXT=@MAN8EXT@
$MAN8DIR=@MAN8DIR@
$DSOLIBS=@DSOLIBS@
# Make sure the MD5 password file is now owned by CUPS_USER...
%postinstall if test -f $SERVERROOT/passwd.md5; then
%postinstall chown $CUPS_USER $SERVERROOT/passwd.md5
%postinstall fi
# Make sure the shared libraries are refreshed...
%system linux
%postinstall ldconfig
%system all
# Server programs
%system all
# Server files
f 0555 root sys $SBINDIR/cupsd scheduler/cupsd
d 0555 root sys $SERVERBIN -
d 0555 root sys $SERVERBIN/backend -
f 0555 root sys $SERVERBIN/backend/ipp backend/ipp
l 0555 root sys $SERVERBIN/backend/http ipp
f 0555 root sys $SERVERBIN/backend/lpd backend/lpd
f 0555 root sys $SERVERBIN/backend/parallel backend/parallel
f 0555 root sys $SERVERBIN/backend/scsi backend/scsi
f 0555 root sys $SERVERBIN/backend/serial backend/serial
f 0555 root sys $SERVERBIN/backend/socket backend/socket
f 0555 root sys $SERVERBIN/backend/usb backend/usb
d 0555 root sys $SERVERBIN/cgi-bin -
f 0555 root sys $SERVERBIN/cgi-bin/admin.cgi cgi-bin/admin.cgi
f 0555 root sys $SERVERBIN/cgi-bin/classes.cgi cgi-bin/classes.cgi
f 0555 root sys $SERVERBIN/cgi-bin/jobs.cgi cgi-bin/jobs.cgi
f 0555 root sys $SERVERBIN/cgi-bin/printers.cgi cgi-bin/printers.cgi
d 0555 root sys $SERVERBIN/daemon -
f 0555 root sys $SERVERBIN/daemon/cups-lpd scheduler/cups-lpd
f 0555 root sys $SERVERBIN/daemon/cups-polld scheduler/cups-polld
d 0555 root sys $SERVERBIN/filter -
f 0555 root sys $SERVERBIN/filter/gziptoany filter/gziptoany
f 0555 root sys $SERVERBIN/filter/hpgltops filter/hpgltops
f 0555 root sys $SERVERBIN/filter/imagetops filter/imagetops
f 0555 root sys $SERVERBIN/filter/imagetoraster filter/imagetoraster
f 0555 root sys $SERVERBIN/filter/pdftops pdftops/pdftops
f 0555 root sys $SERVERBIN/filter/pstops filter/pstops
f 0555 root sys $SERVERBIN/filter/rastertodymo filter/rastertodymo
f 0555 root sys $SERVERBIN/filter/rastertoepson filter/rastertoepson
f 0555 root sys $SERVERBIN/filter/rastertohp filter/rastertohp
f 0555 root sys $SERVERBIN/filter/texttops filter/texttops
# Admin commands
l 0555 root sys $BINDIR/disable $SBINDIR/accept
l 0555 root sys $BINDIR/enable $SBINDIR/accept
l 0555 root sys $LIBDIR/accept $SBINDIR/accept
l 0555 root sys $LIBDIR/lpadmin $SBINDIR/lpadmin
l 0555 root sys $LIBDIR/reject accept
f 0555 root sys $SBINDIR/accept systemv/accept
f 0555 root sys $SBINDIR/cupsaddsmb systemv/cupsaddsmb
f 0555 root sys $SBINDIR/lpadmin systemv/lpadmin
f 0555 root sys $SBINDIR/lpc berkeley/lpc
f 0555 root sys $SBINDIR/lpinfo systemv/lpinfo
f 0555 root sys $SBINDIR/lpmove systemv/lpmove
l 0555 root sys $SBINDIR/reject accept
%system irix
l 0555 root sys /usr/etc/lpc $SBINDIR/lpc
%system all
# User commands
f 0555 root sys $BINDIR/cancel systemv/cancel
f 0555 root sys $BINDIR/cupstestppd systemv/cupstestppd
f 0555 root sys $BINDIR/lp systemv/lp
f 0555 root sys $BINDIR/lpoptions systemv/lpoptions
f 4555 $CUPS_USER sys $BINDIR/lppasswd systemv/lppasswd
f 0555 root sys $BINDIR/lpq berkeley/lpq
f 0555 root sys $BINDIR/lpr berkeley/lpr
f 0555 root sys $BINDIR/lprm berkeley/lprm
f 0555 root sys $BINDIR/lpstat systemv/lpstat
%system irix
l 0555 root sys /usr/bsd/lpq $BINDIR/lpq
l 0555 root sys /usr/bsd/lpr $BINDIR/lpr
l 0555 root sys /usr/bsd/lprm $BINDIR/lprm
%system all
# DSOs
%if DSOLIBS
%system hpux
f 0555 root sys $LIBDIR/libcups.sl.2 cups/libcups.sl.2
l 0555 root sys $LIBDIR/libcups.sl libcups.sl.2
f 0555 root sys $LIBDIR/libcupsimage.sl.2 filter/libcupsimage.sl.2
l 0555 root sys $LIBDIR/libcupsimage.sl libcupsimage.sl.2
%system aix
f 0555 root sys $LIBDIR/libcups_s.a cups/libcups_s.a
f 0555 root sys $LIBDIR/libcupsimage_s.a filter/libcupsimage_s.a
%system darwin
f 0555 root sys $LIBDIR/libcups.2.dylib cups/libcups.2.dylib
l 0555 root sys $LIBDIR/libcups.dylib libcups.2.dylib
f 0555 root sys $LIBDIR/libcupsimage.2.dylib filter/libcupsimage.2.dylib
l 0555 root sys $LIBDIR/libcupsimage.dylib libcupsimage.2.dylib
%system !hpux !aix !darwin
f 0555 root sys $LIBDIR/libcups.so.2 cups/libcups.so.2
l 0555 root sys $LIBDIR/libcups.so libcups.so.2
f 0555 root sys $LIBDIR/libcupsimage.so.2 filter/libcupsimage.so.2
l 0555 root sys $LIBDIR/libcupsimage.so libcupsimage.so.2
%system all
%endif
# Directories
d 0755 root sys $LOGDIR -
d 0700 $CUPS_USER sys $REQUESTS -
d 1700 $CUPS_USER sys $REQUESTS/tmp -
# Data files
f 0444 root sys $LOCALEDIR/C/cups_C locale/C/cups_C
f 0444 root sys $LOCALEDIR/be/cups_be locale/be/cups_be
f 0444 root sys $LOCALEDIR/cs/cups_cs locale/cs/cups_cs
f 0444 root sys $LOCALEDIR/de/cups_de locale/de/cups_de
f 0444 root sys $LOCALEDIR/en/cups_en locale/en/cups_en
f 0444 root sys $LOCALEDIR/en_US/cups_en_US locale/en_US/cups_en_US
f 0444 root sys $LOCALEDIR/es/cups_es locale/es/cups_es
f 0444 root sys $LOCALEDIR/fr/cups_fr locale/fr/cups_fr
f 0444 root sys $LOCALEDIR/it/cups_it locale/it/cups_it
f 0444 root sys $LOCALEDIR/ru_RU/cups_ru_RU locale/ru_RU/cups_ru_RU
f 0444 root sys $LOCALEDIR/sv/cups_sv locale/sv/cups_sv
f 0444 root sys $LOCALEDIR/uk/cups_uk locale/uk/cups_uk
f 0444 root sys $LOCALEDIR/uk_UA/cups_uk_UA locale/uk_UA/cups_uk_UA
f 0444 root sys $LOCALEDIR/zh_CN/cups_zh_CN locale/zh_CN/cups_zh_CN
d 0555 root sys $DATADIR -
d 0555 root sys $DATADIR/banners -
f 0444 root sys $DATADIR/banners/classified data/classified
f 0444 root sys $DATADIR/banners/confidential data/confidential
f 0444 root sys $DATADIR/banners/secret data/secret
f 0444 root sys $DATADIR/banners/standard data/standard
f 0444 root sys $DATADIR/banners/topsecret data/topsecret
f 0444 root sys $DATADIR/banners/unclassified data/unclassified
d 0555 root sys $DATADIR/charsets -
f 0444 root sys $DATADIR/charsets/windows-874 data/windows-874
f 0444 root sys $DATADIR/charsets/windows-1250 data/windows-1250
f 0444 root sys $DATADIR/charsets/windows-1251 data/windows-1251
f 0444 root sys $DATADIR/charsets/windows-1252 data/windows-1252
f 0444 root sys $DATADIR/charsets/windows-1253 data/windows-1253
f 0444 root sys $DATADIR/charsets/windows-1254 data/windows-1254
f 0444 root sys $DATADIR/charsets/windows-1255 data/windows-1255
f 0444 root sys $DATADIR/charsets/windows-1256 data/windows-1256
f 0444 root sys $DATADIR/charsets/windows-1257 data/windows-1257
f 0444 root sys $DATADIR/charsets/windows-1258 data/windows-1258
f 0444 root sys $DATADIR/charsets/iso-8859-1 data/iso-8859-1
f 0444 root sys $DATADIR/charsets/iso-8859-2 data/iso-8859-2
f 0444 root sys $DATADIR/charsets/iso-8859-3 data/iso-8859-3
f 0444 root sys $DATADIR/charsets/iso-8859-4 data/iso-8859-4
f 0444 root sys $DATADIR/charsets/iso-8859-5 data/iso-8859-5
f 0444 root sys $DATADIR/charsets/iso-8859-6 data/iso-8859-6
f 0444 root sys $DATADIR/charsets/iso-8859-7 data/iso-8859-7
f 0444 root sys $DATADIR/charsets/iso-8859-8 data/iso-8859-8
f 0444 root sys $DATADIR/charsets/iso-8859-9 data/iso-8859-9
f 0444 root sys $DATADIR/charsets/iso-8859-10 data/iso-8859-10
f 0444 root sys $DATADIR/charsets/iso-8859-13 data/iso-8859-13
f 0444 root sys $DATADIR/charsets/iso-8859-14 data/iso-8859-14
f 0444 root sys $DATADIR/charsets/iso-8859-15 data/iso-8859-15
f 0444 root sys $DATADIR/charsets/utf-8 data/utf-8
d 0555 root sys $DATADIR/data -
f 0444 root sys $DATADIR/data/HPGLprolog data/HPGLprolog
f 0444 root sys $DATADIR/data/psglyphs data/psglyphs
f 0444 root sys $DATADIR/data/testprint.ps data/testprint.ps
d 0555 root sys $DATADIR/fonts -
f 0444 root sys $DATADIR/fonts fonts/Courier*
f 0444 root sys $DATADIR/fonts/Symbol fonts/Symbol
d 0555 root sys $DATADIR/model -
f 0444 root sys $DATADIR/model ppd/*.ppd
d 0555 root sys $DATADIR/templates -
c 0444 root sys $DATADIR/templates templates/*.tmpl
d 0555 root sys $DATADIR/templates/de -
c 0444 root sys $DATADIR/templates/de templates/de/*.tmpl
d 0555 root sys $DATADIR/templates/fr -
c 0444 root sys $DATADIR/templates/fr templates/fr/*.tmpl
# Config files
d 0555 root sys $SERVERROOT -
d 0711 $CUPS_USER $CUPS_GROUP $SERVERROOT/certs -
d 0755 root sys $SERVERROOT/interfaces -
d 0755 root sys $SERVERROOT/ppd -
c 0600 root sys $SERVERROOT conf/*.conf
c 0600 root sys $SERVERROOT/mime.convs conf/mime.convs
c 0600 root sys $SERVERROOT/mime.types conf/mime.types
%if PAMDIR
d 0555 root sys $PAMDIR -
%system linux
# Linux almost always supports PAM...
c 0644 root sys $PAMDIR/cups conf/pam.conf
%system irix
# IRIX doesn't normally support PAM, but the freeware project
# includes a version of PAM that can be used...
c 0644 root sys $PAMDIR/cups conf/pam.irix
%system all
%endif
# Developer files
f 0555 root sys $BINDIR/cups-config cups-config
d 0555 root sys $INCLUDEDIR/cups -
f 0444 root sys $INCLUDEDIR/cups/cups.h cups/cups.h
f 0444 root sys $INCLUDEDIR/cups/http.h cups/http.h
f 0444 root sys $INCLUDEDIR/cups/image.h filter/image.h
f 0444 root sys $INCLUDEDIR/cups/ipp.h cups/ipp.h
f 0444 root sys $INCLUDEDIR/cups/language.h cups/language.h
f 0444 root sys $INCLUDEDIR/cups/md5.h cups/md5.h
f 0444 root sys $INCLUDEDIR/cups/ppd.h cups/ppd.h
f 0444 root sys $INCLUDEDIR/cups/raster.h filter/raster.h
f 0444 root sys $LIBDIR/libcups.a cups/libcups.a
f 0444 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a
# Documentation files
d 0555 root sys $DOCDIR -
f 0444 root sys $DOCDIR doc/*.css
f 0444 root sys $DOCDIR doc/*.html
f 0444 root sys $DOCDIR doc/*.pdf
f 0444 root sys $DOCDIR/robots.txt doc/robots.txt
d 0555 root sys $DOCDIR/de -
f 0444 root sys $DOCDIR/de doc/de/*.css
f 0444 root sys $DOCDIR/de doc/de/*.html
f 0444 root sys $DOCDIR/de doc/de/*.pdf
d 0555 root sys $DOCDIR/fr -
f 0444 root sys $DOCDIR/fr doc/fr/*.css
f 0444 root sys $DOCDIR/fr doc/fr/*.html
f 0444 root sys $DOCDIR/fr doc/fr/*.pdf
d 0555 root sys $DOCDIR/images -
f 0444 root sys $DOCDIR/images doc/images/*.gif
# Man pages
d 0555 root sys $AMANDIR -
d 0555 root sys $AMANDIR/cat$MAN8DIR -
d 0555 root sys $AMANDIR/man$MAN8DIR -
d 0555 root sys $MANDIR -
d 0555 root sys $MANDIR/cat1 -
d 0555 root sys $MANDIR/cat5 -
d 0555 root sys $MANDIR/man1 -
d 0555 root sys $MANDIR/man5 -
d 0555 root sys $PMANDIR -
d 0555 root sys $PMANDIR/cat3 -
d 0555 root sys $PMANDIR/man3 -
f 0444 root sys $MANDIR/cat1/backend.$CAT1EXT man/backend.$CAT1EXT
f 0444 root sys $MANDIR/cat1/cupstestppd.$CAT1EXT man/cupstestppd.$CAT1EXT
f 0444 root sys $MANDIR/cat1/filter.$CAT1EXT man/filter.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lpoptions.$CAT1EXT man/lpoptions.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lppasswd.$CAT1EXT man/lppasswd.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lpq.$CAT1EXT man/lpq.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lprm.$CAT1EXT man/lprm.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lpr.$CAT1EXT man/lpr.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lpstat.$CAT1EXT man/lpstat.$CAT1EXT
f 0444 root sys $MANDIR/cat1/lp.$CAT1EXT man/lp.$CAT1EXT
l 0444 root sys $MANDIR/cat1/cancel.$CAT1EXT lp.$CAT1EXT
f 0444 root sys $PMANDIR/cat3/cups-config.$CAT3EXT man/cups-config.$CAT3EXT
f 0444 root sys $MANDIR/cat5/classes.conf.$CAT5EXT man/classes.conf.$CAT5EXT
f 0444 root sys $MANDIR/cat5/cupsd.conf.$CAT5EXT man/cupsd.conf.$CAT5EXT
f 0444 root sys $MANDIR/cat5/mime.convs.$CAT5EXT man/mime.convs.$CAT5EXT
f 0444 root sys $MANDIR/cat5/mime.types.$CAT5EXT man/mime.types.$CAT5EXT
f 0444 root sys $MANDIR/cat5/printers.conf.$CAT5EXT man/printers.conf.$CAT5EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/accept.$CAT8EXT man/accept.$CAT8EXT
l 0444 root sys $AMANDIR/cat$MAN8DIR/reject.$CAT8EXT accept.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/cupsaddsmb.$CAT8EXT man/cupsaddsmb.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/cups-lpd.$CAT8EXT man/cups-lpd.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/cups-polld.$CAT8EXT man/cups-polld.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/cupsd.$CAT8EXT man/cupsd.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/enable.$CAT8EXT man/enable.$CAT8EXT
l 0444 root sys $AMANDIR/cat$MAN8DIR/disable.$CAT8EXT enable.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpadmin.$CAT8EXT man/lpadmin.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpc.$CAT8EXT man/lpc.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpinfo.$CAT8EXT man/lpinfo.$CAT8EXT
f 0444 root sys $AMANDIR/cat$MAN8DIR/lpmove.$CAT8EXT man/lpmove.$CAT8EXT
f 0444 root sys $MANDIR/man1/backend.1 man/backend.man
f 0444 root sys $MANDIR/man1/cupstestppd.1 man/cupstestppd.man
f 0444 root sys $MANDIR/man1/filter.1 man/filter.man
f 0444 root sys $MANDIR/man1/lpoptions.1 man/lpoptions.man
f 0444 root sys $MANDIR/man1/lppasswd.1 man/lppasswd.man
f 0444 root sys $MANDIR/man1/lpq.1 man/lpq.man
f 0444 root sys $MANDIR/man1/lprm.1 man/lprm.man
f 0444 root sys $MANDIR/man1/lpr.1 man/lpr.man
f 0444 root sys $MANDIR/man1/lpstat.1 man/lpstat.man
f 0444 root sys $MANDIR/man1/lp.1 man/lp.man
l 0444 root sys $MANDIR/man1/cancel.1 lp.1
f 0444 root sys $PMANDIR/man3/cups-config.3 man/cups-config.man
f 0444 root sys $MANDIR/man5/classes.conf.5 man/classes.conf.man
f 0444 root sys $MANDIR/man5/cupsd.conf.5 man/cupsd.conf.man
f 0444 root sys $MANDIR/man5/mime.convs.5 man/mime.convs.man
f 0444 root sys $MANDIR/man5/mime.types.5 man/mime.types.man
f 0444 root sys $MANDIR/man5/printers.conf.5 man/printers.conf.man
f 0444 root sys $AMANDIR/man$MAN8DIR/accept.$MAN8EXT man/accept.man
l 0444 root sys $AMANDIR/man$MAN8DIR/reject.$MAN8EXT accept.$MAN8EXT
f 0444 root sys $AMANDIR/man$MAN8DIR/cupsaddsmb.$MAN8EXT man/cupsaddsmb.man
f 0444 root sys $AMANDIR/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.man
f 0444 root sys $AMANDIR/man$MAN8DIR/cups-polld.$MAN8EXT man/cups-polld.man
f 0444 root sys $AMANDIR/man$MAN8DIR/cupsd.$MAN8EXT man/cupsd.man
f 0444 root sys $AMANDIR/man$MAN8DIR/enable.$MAN8EXT man/enable.man
l 0444 root sys $AMANDIR/man$MAN8DIR/disable.$MAN8EXT enable.$MAN8EXT
f 0444 root sys $AMANDIR/man$MAN8DIR/lpadmin.$MAN8EXT man/lpadmin.man
f 0444 root sys $AMANDIR/man$MAN8DIR/lpc.$MAN8EXT man/lpc.man
f 0444 root sys $AMANDIR/man$MAN8DIR/lpinfo.$MAN8EXT man/lpinfo.man
f 0444 root sys $AMANDIR/man$MAN8DIR/lpmove.$MAN8EXT man/lpmove.man
d 0555 root sys $AMANDIR/fr -
d 0555 root sys $AMANDIR/fr/cat$MAN8DIR -
d 0555 root sys $AMANDIR/fr/man$MAN8DIR -
d 0555 root sys $MANDIR/fr -
d 0555 root sys $MANDIR/fr/cat1 -
d 0555 root sys $MANDIR/fr/cat5 -
d 0555 root sys $MANDIR/fr/man1 -
d 0555 root sys $MANDIR/fr/man5 -
d 0555 root sys $PMANDIR/fr -
d 0555 root sys $PMANDIR/fr/cat3 -
d 0555 root sys $PMANDIR/fr/man3 -
f 0444 root sys $MANDIR/fr/cat1/backend.$CAT1EXT man/backend.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/filter.$CAT1EXT man/filter.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lpoptions.$CAT1EXT man/lpoptions.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lppasswd.$CAT1EXT man/lppasswd.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lpq.$CAT1EXT man/lpq.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lprm.$CAT1EXT man/lprm.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lpr.$CAT1EXT man/lpr.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lpstat.$CAT1EXT man/lpstat.$CAT1EXT
f 0444 root sys $MANDIR/fr/cat1/lp.$CAT1EXT man/lp.$CAT1EXT
l 0444 root sys $MANDIR/fr/cat1/cancel.$CAT1EXT lp.$CAT1EXT
f 0444 root sys $PMANDIR/fr/cat3/cups-config.$CAT3EXT man/cups-config.$CAT3EXT
f 0444 root sys $MANDIR/fr/cat5/classes.conf.$CAT5EXT man/classes.conf.$CAT5EXT
f 0444 root sys $MANDIR/fr/cat5/cupsd.conf.$CAT5EXT man/cupsd.conf.$CAT5EXT
f 0444 root sys $MANDIR/fr/cat5/mime.convs.$CAT5EXT man/mime.convs.$CAT5EXT
f 0444 root sys $MANDIR/fr/cat5/mime.types.$CAT5EXT man/mime.types.$CAT5EXT
f 0444 root sys $MANDIR/fr/cat5/printers.conf.$CAT5EXT man/printers.conf.$CAT5EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/accept.$CAT8EXT man/accept.$CAT8EXT
l 0444 root sys $AMANDIR/fr/cat$MAN8DIR/reject.$CAT8EXT accept.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cupsaddsmb.$CAT8EXT man/cupsaddsmb.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cups-lpd.$CAT8EXT man/cups-lpd.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cups-polld.$CAT8EXT man/cups-polld.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/cupsd.$CAT8EXT man/cupsd.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/enable.$CAT8EXT man/enable.$CAT8EXT
l 0444 root sys $AMANDIR/fr/cat$MAN8DIR/disable.$CAT8EXT enable.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpadmin.$CAT8EXT man/lpadmin.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpc.$CAT8EXT man/lpc.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpinfo.$CAT8EXT man/lpinfo.$CAT8EXT
f 0444 root sys $AMANDIR/fr/cat$MAN8DIR/lpmove.$CAT8EXT man/lpmove.$CAT8EXT
f 0444 root sys $MANDIR/fr/man1/backend.1 man/backend.man
f 0444 root sys $MANDIR/fr/man1/filter.1 man/filter.man
f 0444 root sys $MANDIR/fr/man1/lpoptions.1 man/lpoptions.man
f 0444 root sys $MANDIR/fr/man1/lppasswd.1 man/lppasswd.man
f 0444 root sys $MANDIR/fr/man1/lpq.1 man/lpq.man
f 0444 root sys $MANDIR/fr/man1/lprm.1 man/lprm.man
f 0444 root sys $MANDIR/fr/man1/lpr.1 man/lpr.man
f 0444 root sys $MANDIR/fr/man1/lpstat.1 man/lpstat.man
f 0444 root sys $MANDIR/fr/man1/lp.1 man/lp.man
l 0444 root sys $MANDIR/fr/man1/cancel.1 lp.1
f 0444 root sys $PMANDIR/fr/man3/cups-config.3 man/cups-config.man
f 0444 root sys $MANDIR/fr/man5/classes.conf.5 man/classes.conf.man
f 0444 root sys $MANDIR/fr/man5/cupsd.conf.5 man/cupsd.conf.man
f 0444 root sys $MANDIR/fr/man5/mime.convs.5 man/mime.convs.man
f 0444 root sys $MANDIR/fr/man5/mime.types.5 man/mime.types.man
f 0444 root sys $MANDIR/fr/man5/printers.conf.5 man/printers.conf.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/accept.$MAN8EXT man/accept.man
l 0444 root sys $AMANDIR/fr/man$MAN8DIR/reject.$MAN8EXT accept.$MAN8EXT
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cupsaddsmb.$MAN8EXT man/cupsaddsmb.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cups-polld.$MAN8EXT man/cups-polld.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/cupsd.$MAN8EXT man/cupsd.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/enable.$MAN8EXT man/enable.man
l 0444 root sys $AMANDIR/fr/man$MAN8DIR/disable.$MAN8EXT enable.$MAN8EXT
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpadmin.$MAN8EXT man/lpadmin.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpc.$MAN8EXT man/lpc.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpinfo.$MAN8EXT man/lpinfo.man
f 0444 root sys $AMANDIR/fr/man$MAN8DIR/lpmove.$MAN8EXT man/lpmove.man
# Startup script
%system all
i 0555 root sys cups cups.sh
#
# End of "$Id$".
#
+39
Ver Arquivo
@@ -0,0 +1,39 @@
#!/bin/sh
##
# PrintingServices - a.k.a. CUPS
##
. /etc/rc.common
StartService ()
{
if [ "${CUPS:=-YES-}" = "-YES-" ]; then
ConsoleMessage "Starting printing services"
/usr/sbin/cupsd
fi
}
StopService ()
{
# Until cupsd has a pid file...
pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
if test "$pid" != ""; then
ConsoleMessage "Stopping printing services"
kill "${pid}"
fi
}
RestartService ()
{
# Until cupsd has a pid file...
pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
if test "x$pid" != x; then
ConsoleMessage "Restarting printing services"
kill -HUP "${pid}"
else
StartService
fi
}
RunService "$1"
+7
Ver Arquivo
@@ -0,0 +1,7 @@
{
Description = "Printing Services";
Provides = ("PrintingServices");
Requires = ("Resolver");
Uses = ("Network Time");
OrderPreference = "Late";
}
Arquivo executável
+211
Ver Arquivo
@@ -0,0 +1,211 @@
#!/bin/sh
#
# "$Id$"
#
# Startup/shutdown script for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
#### OS-Dependent Information
#
# Linux chkconfig stuff:
#
# chkconfig: 235 99 00
# description: Startup/shutdown script for the Common UNIX \
# Printing System (CUPS).
#
#
# NetBSD 1.5+ rcorder script lines. The format of the following two
# lines is very strict -- please don't add additional spaces!
#
# PROVIDE: cups
# REQUIRE: DAEMON
#
#### OS-Dependent Configuration
case "`uname`" in
IRIX*)
IS_ON=/sbin/chkconfig
if $IS_ON verbose; then
ECHO=echo
else
ECHO=:
fi
ECHO_OK=:
ECHO_ERROR=:
;;
*BSD*)
IS_ON=:
ECHO=echo
ECHO_OK=:
ECHO_ERROR=:
;;
Darwin*)
. /etc/rc.common
if test "${CUPS:=-YES-}" = "-NO-"; then
exit 0
fi
IS_ON=:
ECHO=ConsoleMessage
ECHO_OK=:
ECHO_ERROR=:
;;
Linux*)
IS_ON=/bin/true
if test -f /etc/init.d/functions; then
. /etc/init.d/functions
ECHO=echo
ECHO_OK="echo_success"
ECHO_ERROR="echo_failure"
else
ECHO=echo
ECHO_OK=:
ECHO_ERROR=:
fi
;;
*)
IS_ON=/bin/true
ECHO=echo
ECHO_OK=:
ECHO_ERROR=:
;;
esac
#### OS-Independent Stuff
#
# Set the timezone, if possible... This allows the
# scheduler and all child processes to know the local
# timezone when reporting dates and times to the user.
# If no timezone information is found, then Greenwich
# Mean Time (GMT) will probably be used.
#
for file in /etc/TIMEZONE /etc/rc.config /etc/sysconfig/clock; do
if test -f $file; then
. $file
fi
done
if test "x$ZONE" != x; then
TZ="$ZONE"
fi
if test "x$TIMEZONE" != x; then
TZ="$TIMEZONE"
fi
if test "x$TZ" != x; then
export TZ
fi
#
# See if the CUPS server (cupsd) is running...
#
case "`uname`" in
HP-UX* | AIX* | SINIX*)
pid=`ps -e | awk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'`
;;
IRIX* | SunOS*)
pid=`ps -e | nawk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'`
;;
UnixWare*)
pid=`ps -e | awk '{if (match($6, ".*/cupsd$") || $6 == "cupsd") print $1}'`
. /etc/TIMEZONE
;;
OSF1*)
pid=`ps -e | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
;;
Linux* | *BSD* | Darwin*)
pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'`
;;
*)
pid=""
;;
esac
#
# Start or stop the CUPS server based upon the first argument to the script.
#
case $1 in
start | restart | reload)
if $IS_ON cups; then
if test "$pid" != ""; then
kill -HUP $pid
else
prefix=@prefix@
exec_prefix=@exec_prefix@
@sbindir@/cupsd
if test $? != 0; then
$ECHO_FAIL
$ECHO "cups: unable to $1 scheduler."
exit 1
fi
fi
$ECHO_OK
$ECHO "cups: ${1}ed scheduler."
fi
;;
stop)
if test "$pid" != ""; then
kill $pid
$ECHO_OK
$ECHO "cups: stopped scheduler."
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 with no errors.
#
exit 0
#
# End of "$Id$".
#
+223
Ver Arquivo
@@ -0,0 +1,223 @@
#
# "$Id: cups.spec 3993 2003-11-07 20:18:02Z mike $"
#
# RPM "spec" file for the Common UNIX Printing System (CUPS).
#
# Original version by Jason McMullan <jmcc@ontv.com>.
#
# Copyright 1999-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
Summary: Common Unix Printing System
Name: cups
Version: 1.1.20rc6
Release: 1
Copyright: GPL
Group: System Environment/Daemons
Source: ftp://ftp.easysw.com/pub/cups/%{version}/cups-%{version}-source.tar.gz
Url: http://www.cups.org
Packager: Anonymous <anonymous@foo.com>
Vendor: Easy Software Products
# Use buildroot so as not to disturb the version already installed
BuildRoot: /var/tmp/%{name}-root
# Dependencies...
Conflicts: lpr, LPRng
Provides: libcups.so.2
Provides: libcupsimage.so.2
%package devel
Summary: Common Unix Printing System - development environment
Group: Development/Libraries
%package libs
Summary: Common Unix Printing System - shared libraries
Group: System Environment/Libraries
Provides: libcups1
%description
The Common UNIX Printing System provides a portable printing layer for
UNIX® operating systems. It has been developed by Easy Software Products
to promote a standard printing solution for all UNIX vendors and users.
CUPS provides the System V and Berkeley command-line interfaces.
%description devel
The Common UNIX Printing System provides a portable printing layer for
UNIX® operating systems. This is the development package for creating
additional printer drivers and other CUPS services.
%description libs
The Common UNIX Printing System provides a portable printing layer for
UNIX® operating systems. This package contains the CUPS shared libraries.
%prep
%setup
%build
CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" ./configure
# If we got this far, all prerequisite libraries must be here.
make
%install
# Make sure the RPM_BUILD_ROOT directory exists.
rm -rf $RPM_BUILD_ROOT
make BUILDROOT=$RPM_BUILD_ROOT install
%post
ldconfig
if test -x /sbin/chkconfig; then
/sbin/chkconfig --add cups
/sbin/chkconfig cups on
fi
# these lines automatically start cupsd after installation; commented out
# by request...
#if test -f /sbin/init.d/cups; then
# /sbin/init.d/cups start
#fi
#if test -f /etc/rc.d/init.d/cups; then
# /etc/rc.d/init.d/cups start
#fi
#if test -f /etc/init.d/cups; then
# /etc/init.d/cups start
#fi
%preun
if test -f /sbin/init.d/cups; then
/sbin/init.d/cups stop
fi
if test -f /etc/rc.d/init.d/cups; then
/etc/rc.d/init.d/cups stop
fi
if test -f /etc/init.d/cups; then
/etc/init.d/cups stop
fi
if test -x /sbin/chkconfig; then
/sbin/chkconfig --del cups
fi
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
%dir /etc/cups
%config(noreplace) /etc/cups/*.conf
%dir /etc/cups/certs
%dir /etc/cups/interfaces
/etc/cups/mime.types
/etc/cups/mime.convs
%dir /etc/cups/ppd
%dir /etc/pam.d
/etc/pam.d/*
# RC dirs are a pain under Linux... Uncomment the appropriate ones if you
# don't use Red Hat or Mandrake...
# OLD RedHat/Mandrake
/etc/rc.d/init.d/*
/etc/rc.d/rc0.d/*
/etc/rc.d/rc2.d/*
/etc/rc.d/rc3.d/*
/etc/rc.d/rc5.d/*
#/sbin/rc.d/*
#/sbin/rc.d/rc0.d/*
#/sbin/rc.d/rc2.d/*
#/sbin/rc.d/rc3.d/*
#/sbin/rc.d/rc5.d/*
# NEW RedHat/Mandrake
#/etc/init.d/*
#/etc/rc0.d/*
#/etc/rc2.d/*
#/etc/rc3.d/*
#/etc/rc5.d/*
/usr/bin/cancel
/usr/bin/cupstestppd
/usr/bin/disable
/usr/bin/enable
/usr/bin/lp*
%dir /usr/lib/cups
/usr/lib/cups/*
/usr/sbin/*
%dir /usr/share/cups
/usr/share/cups/*
%dir /usr/share/doc/cups
/usr/share/doc/cups/*
%dir /usr/share/locale
/usr/share/locale/*
%dir /usr/share/man/cat1
/usr/share/man/cat1/*
%dir /usr/share/man/cat5
/usr/share/man/cat5/*
%dir /usr/share/man/cat8
/usr/share/man/cat8/*
%dir /usr/share/man/man1
/usr/share/man/man1/*
%dir /usr/share/man/man5
/usr/share/man/man5/*
%dir /usr/share/man/man8
/usr/share/man/man8/*
%dir /usr/share/man/fr/cat1
/usr/share/man/fr/cat1/*
%dir /usr/share/man/fr/cat5
/usr/share/man/fr/cat5/*
%dir /usr/share/man/fr/cat8
/usr/share/man/fr/cat8/*
%dir /usr/share/man/fr/man1
/usr/share/man/fr/man1/*
%dir /usr/share/man/fr/man5
/usr/share/man/fr/man5/*
%dir /usr/share/man/fr/man8
/usr/share/man/fr/man8/*
%attr(0700,lp,root) %dir /var/spool/cups
%attr(1700,lp,root) %dir /var/spool/cups/tmp
%files devel
/usr/bin/cups-config
%dir /usr/include/cups
/usr/include/cups/*
/usr/lib/*.a
%dir /usr/share/man/cat3
/usr/share/man/cat3/*
%dir /usr/share/man/man3
/usr/share/man/man3/*
%dir /usr/share/man/fr/cat3
/usr/share/man/fr/cat3/*
%dir /usr/share/man/fr/man3
/usr/share/man/fr/man3/*
%files libs
/usr/lib/*.so*
#
# End of "$Id: cups.spec 3993 2003-11-07 20:18:02Z mike $".
#
+9
Ver Arquivo
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
<key>Starting printing services</key>
<string>Starting printing services</string>
</dict>
</plist>
+13
Ver Arquivo
@@ -0,0 +1,13 @@
libcups.a
libcups.la
libcups.sl
libcups.sl.2
libcups.so
libcups.so.2
libcups_s.a
libcups.2.dylib
libcups.dylib
testhttp
testipp
testlang
testppd
+31
Ver Arquivo
@@ -0,0 +1,31 @@
# DO NOT DELETE
attr.o: ppd.h debug.h string.h ../config.h
auth.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h language.h
auth.o: debug.h
dest.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h language.h
emit.o: ppd.h string.h ../config.h
encode.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h debug.h
getputfile.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h language.h
getputfile.o: debug.h
http.o: http-private.h ../config.h http.h string.h md5.h debug.h
http-addr.o: string.h ../config.h http.h md5.h
http-support.o: string.h ../config.h http.h md5.h ipp.h
ipp.o: string.h ../config.h ipp.h http.h md5.h debug.h
ipp-support.o: string.h ../config.h language.h ipp.h http.h md5.h debug.h
language.o: string.h ../config.h language.h debug.h cups_C.h
mark.o: ppd.h string.h ../config.h debug.h
md5.o: md5.h string.h ../config.h
md5passwd.o: http.h string.h ../config.h md5.h
options.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h debug.h
page.o: ppd.h string.h ../config.h
ppd.o: ppd.h string.h ../config.h language.h debug.h
snprintf.o: string.h ../config.h
string.o: string.h ../config.h
tempfile.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h debug.h
usersys.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h
util.o: cups.h ipp.h http.h string.h ../config.h md5.h ppd.h language.h
util.o: debug.h
testhttp.o: http.h string.h ../config.h md5.h
testipp.o: ../cups/string.h ../config.h string.h ipp.h http.h md5.h
testlang.o: language.h
+121 -39
Ver Arquivo
@@ -3,7 +3,7 @@
#
# Support library Makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
# Copyright 1997-2003 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
@@ -14,13 +14,15 @@
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
# This file is subject to the Apple OS-Developed Software exception.
#
include ../Makedefs
@@ -28,20 +30,27 @@ include ../Makedefs
# Object files...
#
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
LIBOBJS = attr.o auth.o dest.o emit.o encode.o getputfile.o \
http.o http-addr.o http-support.o ipp.o ipp-support.o \
language.o mark.o md5.o md5passwd.o options.o page.o \
ppd.o snprintf.o string.o tempfile.o usersys.o util.o
OBJS = $(LIBOBJS) testhttp.o testipp.o testlang.o
#
# Header files to install...
#
HEADERS = cups.h http.h ipp.h language.h mime.h ppd.h raster.h
HEADERS = cups.h http.h ipp.h language.h md5.h ppd.h
#
# Targets in this directory...
#
TARGETS = libcups.a testmime testppd testhttp
TARGETS = $(LIBCUPS) libcups.a \
testhttp testipp testlang
#
# Make all targets...
@@ -49,81 +58,154 @@ TARGETS = libcups.a testmime testppd testhttp
all: $(TARGETS)
#
# Remove object and target files...
#
clean:
rm -f $(OBJS) $(TARGETS)
$(RM) $(OBJS) $(TARGETS) `basename $(LIBCUPS) .2` libcups.dylib
#
# Update dependencies (without system header dependencies...)
#
depend:
makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1
#
# Install object and target files...
#
install: all
-$(MKDIR) $(LIBDIR)
$(CP) libcups.a $(LIBDIR)
-$(MKDIR) $(INCLUDEDIR)/cups
$(CP) $(HEADERS) $(INCLUDEDIR)/cups
install: all installhdrs
$(INSTALL_DIR) $(LIBDIR)
$(INSTALL_LIB) $(LIBCUPS) $(LIBDIR)
if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \
$(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
$(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \
fi
if test $(LIBCUPS) = "libcups.2.dylib"; then \
$(STRIP) -x $(LIBDIR)/$(LIBCUPS); \
$(RM) $(LIBDIR)/libcups.dylib; \
$(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \
fi
if test $(LIBCUPS) != "libcups.a"; then \
$(INSTALL_LIB) libcups.a $(LIBDIR); \
fi
$(RANLIB) $(LIBDIR)/libcups.a
installhdrs:
$(INSTALL_DIR) $(INCLUDEDIR)/cups
for file in $(HEADERS); do \
$(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \
done
#
# libcups.so.2, libcups.sl.2
#
libcups.so.2 libcups.sl.2: $(LIBOBJS) ../Makedefs
echo Linking $@...
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS) $(SSLLIBS) $(COMMONLIBS)
$(RM) `basename $@ .2`
$(LN) $@ `basename $@ .2`
#
# libcups.2.dylib
#
libcups.2.dylib: $(LIBOBJS) ../Makedefs
echo Linking $@...
$(DSO) $(DSOFLAGS) -o $@ \
-install_name $(libdir)/$@ \
-current_version 2.5.0 \
-compatibility_version 2.0.0 \
$(LIBOBJS) $(SSLLIBS) $(COMMONLIBS)
$(RM) libcups.dylib
$(LN) $@ libcups.dylib
#
# libcups_s.a
#
libcups_s.a: $(LIBOBJS) ../Makedefs
echo Creating $@...
$(RM) libcups_s.exp
(echo _ipp_add_attr; echo _ipp_free_attr) >libcups_s.exp
$(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o $(LIBOBJS) $(SSLLIBS) $(COMMONLIBS) -lm
$(RM) $@
$(AR) $(ARFLAGS) $@ libcups_s.o
#
# libcups.la
#
libcups.la: $(LIBOBJS) ../Makedefs
echo Linking $@...
$(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \
-version-info 2:5 $(SSLLIBS) $(COMMONLIBS)
#
# libcups.a
#
libcups.a: $(OBJS)
libcups.a: $(LIBOBJS)
echo Archiving $@...
$(RM) $@
$(AR) $(ARFLAGS) $@ $(OBJS)
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
$(RANLIB) $@
#
# cups_C.h - the default POSIX locale that is compiled in.
#
cups_C.h: ../locale/C/cups_C
echo Generating $@...
$(RM) cups_C.h
$(AWK) '{print "\"" $$0 "\","}' < ../locale/C/cups_C > cups_C.h
emit.o: ppd.h ../config.h ../Makedefs
filter.o: mime.h ../config.h ../Makedefs
http.o: http.h ipp.h string.h ../config.h ../Makedefs
ipp.o: http.h ipp.h ../config.h ../Makedefs
language.o: cups_C.h language.h string.h ../config.h ../Makedefs
mark.o: ppd.h ../config.h ../Makedefs
mime.o: mime.h ../config.h ../Makedefs
options.o: cups.h ../config.h ../Makedefs
page.o: ppd.h ../config.h ../Makedefs
ppd.o: ppd.h ../config.h ../Makedefs
raster.o: raster.h ../config.h ../Makedefs
string.o: string.h ../config.h ../Makedefs
type.o: mime.h ../config.h ../Makedefs
util.o: cups.h http.h ipp.h ../config.h ../Makedefs
#
# testhttp
# testhttp (dependency on static CUPS library is intentional)
#
testhttp: testhttp.o libcups.a
$(CC) $(LDFLAGS) -o $@ testhttp.o $(LIBS)
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ testhttp.o libcups.a $(NETLIBS) $(SSLLIBS) $(COMMONLIBS)
testhttp.o: http.h ../Makedefs
#
# testmime
# testipp (dependency on static CUPS library is intentional)
#
testmime: testmime.o libcups.a
$(CC) $(LDFLAGS) -o $@ testmime.o $(LIBS)
testipp: testipp.o libcups.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ testipp.o libcups.a $(NETLIBS) $(SSLLIBS) $(COMMONLIBS)
testmime.o: mime.h ../Makedefs
#
# testppd
# testlang (dependency on static CUPS library is intentional)
#
testppd: testppd.o libcups.a
$(CC) $(LDFLAGS) -o $@ testppd.o $(LIBS)
testlang: testlang.o libcups.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ testlang.o libcups.a $(NETLIBS) $(SSLLIBS) $(COMMONLIBS)
#
# Dependencies...
#
include Dependencies
testppd.o: ppd.h ../Makedefs
#
# End of "$Id$".
+180
Ver Arquivo
@@ -0,0 +1,180 @@
/*
* "$Id$"
*
* PPD model-specific attribute routines for the Common UNIX Printing System
* (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9600
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ppdFindAttr() - Find the first matching attribute...
* ppdFindNextAttr() - Find the next matching attribute...
*/
/*
* Include necessary headers...
*/
#include "ppd.h"
#include "debug.h"
#include "string.h"
#include <stdlib.h>
/*
* Private function...
*/
extern int _ppd_attr_compare(ppd_attr_t **a, ppd_attr_t **b);
/*
* 'ppdFindAttr()' - Find the first matching attribute...
*/
ppd_attr_t * /* O - Attribute or NULL if not found */
ppdFindAttr(ppd_file_t *ppd, /* I - PPD file data */
const char *name, /* I - Attribute name */
const char *spec) /* I - Specifier string or NULL */
{
ppd_attr_t key, /* Search key */
*keyptr, /* Pointer to key */
**match; /* Matching attribute */
/*
* Range check input...
*/
if (ppd == NULL || name == NULL || ppd->num_attrs == 0)
return (NULL);
/*
* Do a binary search for a matching attribute...
*/
memset(&key, 0, sizeof(key));
strncpy(key.name, name, sizeof(key.name) - 1);
if (spec)
strncpy(key.spec, spec, sizeof(key.spec) - 1);
keyptr = &key;
match = bsearch(&keyptr, ppd->attrs, ppd->num_attrs, sizeof(ppd_attr_t *),
(int (*)(const void *, const void *))_ppd_attr_compare);
if (match == NULL)
{
/*
* No match!
*/
ppd->cur_attr = -1;
return (NULL);
}
if (match > ppd->attrs && spec == NULL)
{
/*
* Find the first attribute with the same name...
*/
while (match > ppd->attrs)
{
if (strcmp(match[-1]->name, name) != 0)
break;
match --;
}
}
/*
* Save the current attribute and return its value...
*/
ppd->cur_attr = match - ppd->attrs;
return (*match);
}
/*
* 'ppdFindNextAttr()' - Find the next matching attribute...
*/
ppd_attr_t * /* O - Attribute or NULL if not found */
ppdFindNextAttr(ppd_file_t *ppd, /* I - PPD file data */
const char *name, /* I - Attribute name */
const char *spec) /* I - Specifier string or NULL */
{
ppd_attr_t **match; /* Matching attribute */
/*
* Range check input...
*/
if (ppd == NULL || name == NULL || ppd->num_attrs == 0 || ppd->cur_attr < 0)
return (NULL);
/*
* See if there are more attributes to return...
*/
ppd->cur_attr ++;
if (ppd->cur_attr >= ppd->num_attrs)
{
/*
* Nope...
*/
ppd->cur_attr = -1;
return (NULL);
}
/*
* Check the next attribute to see if it is a match...
*/
match = ppd->attrs + ppd->cur_attr;
if (strcmp((*match)->name, name) != 0 ||
(spec != NULL && strcmp((*match)->spec, spec) != 0))
{
/*
* Nope...
*/
ppd->cur_attr = -1;
return (NULL);
}
/*
* Return the next attribute's value...
*/
return (*match);
}
/*
* End of "$Id$".
*/
+238
Ver Arquivo
@@ -0,0 +1,238 @@
/*
* "$Id$"
*
* Authentication functions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* cupsDoAuthentication() - Authenticate a request...
* cups_local_auth() - Get the local authorization certificate if
* available/applicable...
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include "ipp.h"
#include "language.h"
#include "string.h"
#include "debug.h"
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#if defined(WIN32) || defined(__EMX__)
# include <io.h>
#else
# include <unistd.h>
#endif /* WIN32 || __EMX__ */
/*
* Local functions...
*/
static int cups_local_auth(http_t *http);
/*
* 'cupsDoAuthentication()' - Authenticate a request...
*/
int /* O - 0 on success, -1 on error */
cupsDoAuthentication(http_t *http, /* I - HTTP connection to server */
const char *method,/* I - Request method (GET, POST, PUT) */
const char *resource)
/* I - Resource path */
{
const char *password; /* Password string */
char prompt[1024], /* Prompt for user */
realm[HTTP_MAX_VALUE], /* realm="xyz" string */
nonce[HTTP_MAX_VALUE], /* nonce="xyz" string */
encode[512]; /* Encoded username:password */
/*
* Clear the current authentication string...
*/
http->authstring[0] = '\0';
/*
* See if we can do local authentication...
*/
if (!cups_local_auth(http))
return (0);
/*
* Nope, see if we should retry the current digest password...
*/
if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Basic", 5) == 0 ||
http->digest_tries > 1 || !http->userpass[0])
{
/*
* Nope - get a new password from the user...
*/
snprintf(prompt, sizeof(prompt), "Password for %s on %s? ", cupsUser(),
http->hostname);
http->digest_tries = 0;
http->userpass[0] = '\0';
if ((password = cupsGetPassword(prompt)) == NULL)
return (-1);
if (!password[0])
return (-1);
snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(),
password);
}
else
http->digest_tries ++;
/*
* Got a password; encode it for the server...
*/
if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Basic", 5) == 0)
{
/*
* Basic authentication...
*/
httpEncode64(encode, http->userpass);
snprintf(http->authstring, sizeof(http->authstring), "Basic %s", encode);
}
else
{
/*
* Digest authentication...
*/
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm);
httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce);
httpMD5(cupsUser(), realm, strchr(http->userpass, ':') + 1, encode);
httpMD5Final(nonce, "POST", resource, encode);
snprintf(http->authstring, sizeof(http->authstring),
"Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", "
"response=\"%s\"", cupsUser(), realm, nonce, encode);
}
return (0);
}
/*
* 'cups_local_auth()' - Get the local authorization certificate if
* available/applicable...
*/
static int /* O - 0 if available, -1 if not */
cups_local_auth(http_t *http) /* I - HTTP connection to server */
{
#if defined(WIN32) || defined(__EMX__)
/*
* Currently WIN32 and OS-2 do not support the CUPS server...
*/
return (-1);
#else
int pid; /* Current process ID */
FILE *fp; /* Certificate file */
char filename[1024], /* Certificate filename */
certificate[33]; /* Certificate string */
const char *root; /* Server root directory */
DEBUG_printf(("cups_local_auth(http=%p) hostaddr=%08x, hostname=\"%s\"\n",
http, ntohl(http->hostaddr.sin_addr.s_addr), http->hostname));
/*
* See if we are accessing localhost...
*/
if (ntohl(http->hostaddr.sin_addr.s_addr) != 0x7f000001 &&
strcasecmp(http->hostname, "localhost") != 0)
{
DEBUG_puts("cups_local_auth: Not a local connection!");
return (-1);
}
/*
* Try opening a certificate file for this PID. If that fails,
* try the root certificate...
*/
if ((root = getenv("CUPS_SERVERROOT")) == NULL)
root = CUPS_SERVERROOT;
pid = getpid();
snprintf(filename, sizeof(filename), "%s/certs/%d", root, pid);
if ((fp = fopen(filename, "r")) == NULL && pid > 0)
{
DEBUG_printf(("cups_local_auth: Unable to open file %s: %s\n",
filename, strerror(errno)));
snprintf(filename, sizeof(filename), "%s/certs/0", root);
fp = fopen(filename, "r");
}
if (fp == NULL)
{
DEBUG_printf(("cups_local_auth: Unable to open file %s: %s\n",
filename, strerror(errno)));
return (-1);
}
/*
* Read the certificate from the file...
*/
fgets(certificate, sizeof(certificate), fp);
fclose(fp);
/*
* Set the authorization string and return...
*/
snprintf(http->authstring, sizeof(http->authstring), "Local %s", certificate);
DEBUG_printf(("cups_local_auth: Returning authstring = \"%s\"\n",
http->authstring));
return (0);
#endif /* WIN32 || __EMX__ */
}
/*
* End of "$Id$".
*/
+220
Ver Arquivo
@@ -0,0 +1,220 @@
# 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 /MD /W3 /GX /O2 /I "../visualc" /I ".." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# 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 /MDd /W3 /Gm /GX /Zi /Od /I "../visualc" /I ".." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# 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=.\auth.c
# End Source File
# Begin Source File
SOURCE=.\dest.c
# End Source File
# Begin Source File
SOURCE=.\emit.c
# End Source File
# Begin Source File
SOURCE=.\encode.c
# End Source File
# Begin Source File
SOURCE=.\getputfile.c
# End Source File
# Begin Source File
SOURCE=".\http-addr.c"
# End Source File
# Begin Source File
SOURCE=".\http-support.c"
# End Source File
# Begin Source File
SOURCE=.\http.c
# End Source File
# Begin Source File
SOURCE=".\ipp-support.c"
# End Source File
# Begin Source File
SOURCE=.\ipp.c
# End Source File
# Begin Source File
SOURCE=.\language.c
# End Source File
# Begin Source File
SOURCE=.\mark.c
# End Source File
# Begin Source File
SOURCE=.\md5.c
# End Source File
# Begin Source File
SOURCE=.\md5passwd.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=.\snprintf.c
# End Source File
# Begin Source File
SOURCE=.\string.c
# End Source File
# Begin Source File
SOURCE=.\tempfile.c
# End Source File
# Begin Source File
SOURCE=.\usersys.c
# End Source File
# Begin Source File
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=.\cups_C.h
# End Source File
# Begin Source File
SOURCE=.\debug.h
# End Source File
# Begin Source File
SOURCE=.\http.h
# End Source File
# Begin Source File
SOURCE=.\ipp.h
# End Source File
# Begin Source File
SOURCE=.\language.h
# End Source File
# Begin Source File
SOURCE=..\oemlicense\license.h
# End Source File
# Begin Source File
SOURCE=.\md5.h
# End Source File
# Begin Source File
SOURCE=.\ppd.h
# End Source File
# Begin Source File
SOURCE=.\string.h
# End Source File
# End Group
# End Target
# End Project
+88 -32
Ver Arquivo
@@ -3,7 +3,7 @@
*
* API definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -20,6 +20,8 @@
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_CUPS_H_
@@ -29,9 +31,8 @@
* Include necessary headers...
*/
# include <cups/ipp.h>
# include <cups/mime.h>
# include <cups/ppd.h>
# include "ipp.h"
# include "ppd.h"
/*
@@ -47,7 +48,10 @@ extern "C" {
* Constants...
*/
# define CUPS_VERSION 1.0
# define CUPS_VERSION 1.0120
# define CUPS_VERSION_MAJOR 1
# define CUPS_VERSION_MINOR 1
# define CUPS_VERSION_PATCH 20
# define CUPS_DATE_ANY -1
@@ -74,57 +78,109 @@ 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_VARIABLE = 0x8000, /* Can do variable sizes */
CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class */
CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */
CUPS_PRINTER_FAX = 0x40000, /* Fax queue */
CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT) */
};
/*
* Types & structures...
*/
typedef struct /**** Printer Information ****/
{
char name[IPP_MAX_NAME], /* Printer or class name */
uri[HTTP_MAX_URI]; /* Universal resource identifier */
unsigned char info[IPP_MAX_NAME], /* Printer or class info/description */
location[IPP_MAX_NAME]; /* Location text */
ipp_pstate_t state; /* Printer state */
unsigned char message[IPP_MAX_NAME]; /* State text */
cups_ptype_t type; /* Printer type/capability codes */
} cups_browse_t;
typedef struct /**** Printer Options ****/
{
char *name; /* Name of option */
char *value; /* Value of option */
} cups_option_t;
typedef struct /**** Destination ****/
{
char *name, /* Printer or class name */
*instance; /* Local instance name or NULL */
int is_default; /* Is this printer the default? */
int num_options; /* Number of options */
cups_option_t *options; /* Options */
} cups_dest_t;
typedef struct /**** Job ****/
{
int id; /* The job ID */
char *dest, /* Printer or class name */
*title, /* Title/job name */
*user, /* User the submitted the job */
*format; /* Document format */
ipp_jstate_t state; /* Job state */
int size, /* Size in kilobytes */
priority; /* Priority (1-100) */
time_t completed_time, /* Time the job was completed */
creation_time, /* Time the job was created */
processing_time; /* Time the job was processed */
} cups_job_t;
/*
* Functions...
*/
extern int cupsCancelJob(char *printer, int job);
extern int cupsCancelJob(const char *printer, int job);
#define cupsDoRequest(http,request,resource) cupsDoFileRequest((http),(request),(resource),NULL)
extern ipp_t *cupsDoFileRequest(http_t *http, ipp_t *request,
char *resource, char *filename);
const char *resource, const char *filename);
extern http_encryption_t cupsEncryption(void);
extern void cupsFreeJobs(int num_jobs, cups_job_t *jobs);
extern int cupsGetClasses(char ***classes);
extern char *cupsGetPPD(char *printer);
extern char *cupsGetDefault(void);
extern const char *cupsGetDefault(void);
extern int cupsGetJobs(cups_job_t **jobs, const char *dest,
int myjobs, int completed);
extern const char *cupsGetPPD(const char *printer);
extern int cupsGetPrinters(char ***printers);
extern int cupsPrintFile(char *printer, char *filename, char *title,
int num_options, cups_option_t *options);
extern ipp_status_t cupsLastError(void);
extern int cupsPrintFile(const char *printer, const char *filename,
const char *title, int num_options,
cups_option_t *options);
extern int cupsPrintFiles(const char *printer, int num_files,
const char **files, const char *title,
int num_options, cups_option_t *options);
extern char *cupsTempFile(char *filename, int len);
extern int cupsTempFd(char *filename, int len);
extern int cupsAddOption(char *name, char *value, int num_options,
cups_option_t **options);
extern int cupsAddDest(const char *name, const char *instance,
int num_dests, cups_dest_t **dests);
extern void cupsFreeDests(int num_dests, cups_dest_t *dests);
extern cups_dest_t *cupsGetDest(const char *name, const char *instance,
int num_dests, cups_dest_t *dests);
extern int cupsGetDests(cups_dest_t **dests);
extern void cupsSetDests(int num_dests, cups_dest_t *dests);
extern int cupsAddOption(const char *name, const char *value,
int num_options, cups_option_t **options);
extern void cupsEncodeOptions(ipp_t *ipp, int num_options,
cups_option_t *options);
extern void cupsFreeOptions(int num_options, cups_option_t *options);
extern char *cupsGetOption(char *name, int num_options,
extern const char *cupsGetOption(const char *name, int num_options,
cups_option_t *options);
extern int cupsParseOptions(char *arg, int num_options,
extern int cupsParseOptions(const 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 void cupsSetEncryption(http_encryption_t e);
extern void cupsSetPasswordCB(const char *(*cb)(const char *));
extern void cupsSetServer(const char *server);
extern void cupsSetUser(const char *user);
extern const char *cupsUser(void);
/**** New in CUPS 1.1.20 ****/
extern int cupsDoAuthentication(http_t *http, const char *method,
const char *resource);
extern http_status_t cupsGetFile(http_t *http, const char *resource,
const char *filename);
extern http_status_t cupsGetFd(http_t *http, const char *resource, int fd);
extern http_status_t cupsPutFile(http_t *http, const char *resource,
const char *filename);
extern http_status_t cupsPutFd(http_t *http, const char *resource, int fd);
# ifdef __cplusplus
}
# endif /* __cplusplus */
+135
Ver Arquivo
@@ -0,0 +1,135 @@
"iso-8859-1",
"OK",
"Cancel",
"Help",
"Quit",
"Close",
"Yes",
"No",
"On",
"Off",
"Save",
"Discard",
"Default",
"Options",
"More Info",
"Black",
"Color",
"Cyan",
"Magenta",
"Yellow",
"Copyright 1993-2003 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",
"Options Installed",
"Auto",
"400 Your browser sent a request that this server could not understand.",
"This server could not verify that you are authorized to access the resource.",
"You must pay to access this server.",
"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.",
"426 An upgrade to a secure connection is required. If you are seeing this message in a web browser then it does not support HTTP encryption upgrades.",
"500 The server has detected an unrecoverable error and cannot process your request.",
"The requested method is not implemented by this server.",
"The proxy server received an invalid response from an upstream server.",
"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.",
+4 -2
Ver Arquivo
@@ -3,7 +3,7 @@
*
* Debugging macros for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -14,12 +14,14 @@
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44145 Airport View Drive, Suite 204
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_DEBUG_H_
+800
Ver Arquivo
@@ -0,0 +1,800 @@
/*
* "$Id$"
*
* User-defined destination (and option) support for the Common UNIX
* Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* cupsAddDest() - Add a destination to the list of destinations.
* cupsFreeDests() - Free the memory used by the list of destinations.
* cupsGetDest() - Get the named destination from the list.
* cupsGetDests() - Get the list of destinations.
* cupsSetDests() - Set the list of destinations.
* cups_get_dests() - Get destinations from a file.
* cups_get_sdests() - Get destinations from a server.
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include "language.h"
#include "string.h"
#include <stdlib.h>
#include <ctype.h>
/*
* Local functions...
*/
static int cups_get_dests(const char *filename, int num_dests,
cups_dest_t **dests);
static int cups_get_sdests(ipp_op_t op, int num_dests,
cups_dest_t **dests);
/*
* 'cupsAddDest()' - Add a destination to the list of destinations.
*/
int /* O - New number of destinations */
cupsAddDest(const char *name, /* I - Name of destination */
const char *instance, /* I - Instance of destination */
int num_dests, /* I - Number of destinations */
cups_dest_t **dests) /* IO - Destinations */
{
int i; /* Looping var */
cups_dest_t *dest; /* Destination pointer */
if (name == NULL || dests == NULL)
return (0);
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL)
return (num_dests);
/*
* Add new destination...
*/
if (num_dests == 0)
dest = malloc(sizeof(cups_dest_t));
else
dest = realloc(*dests, sizeof(cups_dest_t) * (num_dests + 1));
if (dest == NULL)
return (num_dests);
*dests = dest;
for (i = num_dests; i > 0; i --, dest ++)
if (strcasecmp(name, dest->name) < 0)
break;
else if (strcasecmp(name, dest->name) == 0 &&
instance != NULL && dest->instance != NULL &&
strcasecmp(instance, dest->instance) < 0)
break;
if (i > 0)
memmove(dest + 1, dest, i * sizeof(cups_dest_t));
dest->name = strdup(name);
dest->is_default = 0;
dest->num_options = 0;
dest->options = (cups_option_t *)0;
if (instance == NULL)
dest->instance = NULL;
else
dest->instance = strdup(instance);
return (num_dests + 1);
}
/*
* 'cupsFreeDests()' - Free the memory used by the list of destinations.
*/
void
cupsFreeDests(int num_dests, /* I - Number of destinations */
cups_dest_t *dests) /* I - Destinations */
{
int i; /* Looping var */
cups_dest_t *dest; /* Current destination */
if (num_dests == 0 || dests == NULL)
return;
for (i = num_dests, dest = dests; i > 0; i --, dest ++)
{
free(dest->name);
if (dest->instance)
free(dest->instance);
cupsFreeOptions(dest->num_options, dest->options);
}
free(dests);
}
/*
* 'cupsGetDest()' - Get the named destination from the list.
*/
cups_dest_t * /* O - Destination pointer or NULL */
cupsGetDest(const char *name, /* I - Name of destination */
const char *instance, /* I - Instance of destination */
int num_dests, /* I - Number of destinations */
cups_dest_t *dests) /* I - Destinations */
{
int comp; /* Result of comparison */
if (num_dests == 0 || dests == NULL)
return (NULL);
if (name == NULL)
{
/*
* NULL name for default printer.
*/
while (num_dests > 0)
{
if (dests->is_default)
return (dests);
num_dests --;
dests ++;
}
}
else
{
/*
* Lookup name and optionally the instance...
*/
while (num_dests > 0)
{
if ((comp = strcasecmp(name, dests->name)) < 0)
return (NULL);
else if (comp == 0)
{
if ((instance == NULL && dests->instance == NULL) ||
(instance != NULL && dests->instance != NULL &&
strcasecmp(instance, dests->instance) == 0))
return (dests);
}
num_dests --;
dests ++;
}
}
return (NULL);
}
/*
* 'cupsGetDests()' - Get the list of destinations.
*/
int /* O - Number of destinations */
cupsGetDests(cups_dest_t **dests) /* O - Destinations */
{
int i; /* Looping var */
int num_dests; /* Number of destinations */
cups_dest_t *dest; /* Destination pointer */
const char *home; /* HOME environment variable */
char filename[1024]; /* Local ~/.lpoptions file */
const char *defprinter; /* Default printer */
char name[1024], /* Copy of printer name */
*instance; /* Pointer to instance name */
int num_reals; /* Number of real queues */
cups_dest_t *reals; /* Real queues */
/*
* Initialize destination array...
*/
num_dests = 0;
*dests = (cups_dest_t *)0;
/*
* Grab the printers and classes...
*/
num_dests = cups_get_sdests(CUPS_GET_PRINTERS, num_dests, dests);
num_dests = cups_get_sdests(CUPS_GET_CLASSES, num_dests, dests);
/*
* Make a copy of the "real" queues for a later sanity check...
*/
if (num_dests > 0)
{
num_reals = num_dests;
reals = calloc(num_reals, sizeof(cups_dest_t));
if (reals)
memcpy(reals, *dests, num_reals * sizeof(cups_dest_t));
else
num_reals = 0;
}
else
{
num_reals = 0;
reals = NULL;
}
/*
* Grab the default destination...
*/
if ((defprinter = cupsGetDefault()) != NULL)
{
/*
* Grab printer and instance name...
*/
strlcpy(name, defprinter, sizeof(name));
if ((instance = strchr(name, '/')) != NULL)
*instance++ = '\0';
/*
* Lookup the printer and instance and make it the default...
*/
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL)
dest->is_default = 1;
}
else
{
/*
* This initialization of "instance" is unnecessary, but avoids a
* compiler warning...
*/
instance = NULL;
}
/*
* Load the /etc/cups/lpoptions and ~/.lpoptions files...
*/
if ((home = getenv("CUPS_SERVERROOT")) != NULL)
{
snprintf(filename, sizeof(filename), "%s/lpoptions", home);
num_dests = cups_get_dests(filename, num_dests, dests);
}
else
num_dests = cups_get_dests(CUPS_SERVERROOT "/lpoptions", num_dests, dests);
if ((home = getenv("HOME")) != NULL)
{
snprintf(filename, sizeof(filename), "%s/.lpoptions", home);
num_dests = cups_get_dests(filename, num_dests, dests);
}
/*
* Validate the current default destination - this prevents old
* Default lines in /etc/cups/lpoptions and ~/.lpoptions from
* pointing to a non-existent printer or class...
*/
if (num_reals)
{
/*
* See if we have a default printer...
*/
if ((dest = cupsGetDest(NULL, NULL, num_dests, *dests)) != NULL)
{
/*
* Have a default; see if it is real...
*/
dest = cupsGetDest(dest->name, NULL, num_reals, reals);
}
/*
* If dest is NULL, then no default (that exists) is set, so we
* need to set a default if one exists...
*/
if (dest == NULL && defprinter != NULL)
{
for (i = 0; i < num_dests; i ++)
(*dests)[i].is_default = 0;
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL)
dest->is_default = 1;
}
/*
* Free memory...
*/
free(reals);
}
/*
* Return the number of destinations...
*/
return (num_dests);
}
/*
* 'cupsSetDests()' - Set the list of destinations.
*/
void
cupsSetDests(int num_dests, /* I - Number of destinations */
cups_dest_t *dests) /* I - Destinations */
{
int i, j; /* Looping vars */
int wrote; /* Wrote definition? */
cups_dest_t *dest; /* Current destination */
cups_option_t *option; /* Current option */
FILE *fp; /* File pointer */
const char *home; /* HOME environment variable */
char filename[1024]; /* lpoptions file */
int num_temps; /* Number of temporary destinations */
cups_dest_t *temps, /* Temporary destinations */
*temp; /* Current temporary dest */
const char *val; /* Value of temporary option */
/*
* Get the server destinations...
*/
num_temps = cups_get_sdests(CUPS_GET_PRINTERS, 0, &temps);
num_temps = cups_get_sdests(CUPS_GET_CLASSES, num_temps, &temps);
/*
* Figure out which file to write to...
*/
if ((home = getenv("CUPS_SERVERROOT")) != NULL)
snprintf(filename, sizeof(filename), "%s/lpoptions", home);
else
strcpy(filename, CUPS_SERVERROOT "/lpoptions");
#ifndef WIN32
if (getuid())
{
/*
* Merge in server defaults...
*/
num_temps = cups_get_dests(filename, num_temps, &temps);
/*
* Point to user defaults...
*/
if ((home = getenv("HOME")) != NULL)
snprintf(filename, sizeof(filename), "%s/.lpoptions", home);
}
#endif /* !WIN32 */
/*
* Try to open the file...
*/
if ((fp = fopen(filename, "w")) == NULL)
{
cupsFreeDests(num_temps, temps);
return;
}
/*
* Write each printer; each line looks like:
*
* Dest name[/instance] options
* Default name[/instance] options
*/
for (i = num_dests, dest = dests; i > 0; i --, dest ++)
if (dest->instance != NULL || dest->num_options != 0 || dest->is_default)
{
if (dest->is_default)
{
fprintf(fp, "Default %s", dest->name);
if (dest->instance)
fprintf(fp, "/%s", dest->instance);
wrote = 1;
}
else
wrote = 0;
if ((temp = cupsGetDest(dest->name, dest->instance, num_temps, temps)) == NULL)
temp = cupsGetDest(dest->name, NULL, num_temps, temps);
for (j = dest->num_options, option = dest->options; j > 0; j --, option ++)
{
/*
* See if the server/global options match these; if so, don't
* write 'em.
*/
if (temp && (val = cupsGetOption(option->name, temp->num_options,
temp->options)) != NULL)
{
if (strcasecmp(val, option->value) == 0)
continue;
}
/*
* Options don't match, write to the file...
*/
if (!wrote)
{
fprintf(fp, "Dest %s", dest->name);
if (dest->instance)
fprintf(fp, "/%s", dest->instance);
wrote = 1;
}
if (option->value[0])
{
if (strchr(option->value, ' ') != NULL)
fprintf(fp, " %s=\"%s\"", option->name, option->value);
else
fprintf(fp, " %s=%s", option->name, option->value);
}
else
fprintf(fp, " %s", option->name);
}
if (wrote)
fputs("\n", fp);
}
/*
* Free the temporary destinations...
*/
cupsFreeDests(num_temps, temps);
/*
* Close the file and return...
*/
fclose(fp);
}
/*
* 'cups_get_dests()' - Get destinations from a file.
*/
static int /* O - Number of destinations */
cups_get_dests(const char *filename, /* I - File to read from */
int num_dests, /* I - Number of destinations */
cups_dest_t **dests) /* IO - Destinations */
{
int i; /* Looping var */
cups_dest_t *dest; /* Current destination */
FILE *fp; /* File pointer */
char line[8192], /* Line from file */
*lineptr, /* Pointer into line */
*name, /* Name of destination/option */
*instance; /* Instance of destination */
const char *printer; /* PRINTER or LPDEST */
/*
* Check environment variables...
*/
if ((printer = getenv("LPDEST")) == NULL)
if ((printer = getenv("PRINTER")) != NULL)
if (strcmp(printer, "lp") == 0)
printer = NULL;
/*
* Try to open the file...
*/
if ((fp = fopen(filename, "r")) == NULL)
return (num_dests);
/*
* Read each printer; each line looks like:
*
* Dest name[/instance] options
* Default name[/instance] options
*/
while (fgets(line, sizeof(line), fp) != NULL)
{
/*
* See what type of line it is...
*/
if (strncasecmp(line, "dest", 4) == 0 && isspace(line[4]))
lineptr = line + 4;
else if (strncasecmp(line, "default", 7) == 0 && isspace(line[7]))
lineptr = line + 7;
else
continue;
/*
* Skip leading whitespace...
*/
while (isspace(*lineptr))
lineptr ++;
if (!*lineptr)
continue;
name = lineptr;
/*
* Search for an instance...
*/
while (!isspace(*lineptr) && *lineptr && *lineptr != '/')
lineptr ++;
if (!*lineptr)
continue;
if (*lineptr == '/')
{
/*
* Found an instance...
*/
*lineptr++ = '\0';
instance = lineptr;
/*
* Search for an instance...
*/
while (!isspace(*lineptr) && *lineptr)
lineptr ++;
}
else
instance = NULL;
*lineptr++ = '\0';
/*
* See if the primary instance of the destination exists; if not,
* ignore this entry and move on...
*/
if (cupsGetDest(name, NULL, num_dests, *dests) == NULL)
continue;
/*
* Add the destination...
*/
num_dests = cupsAddDest(name, instance, num_dests, dests);
if ((dest = cupsGetDest(name, instance, num_dests, *dests)) == NULL)
{
/*
* Out of memory!
*/
fclose(fp);
return (num_dests);
}
/*
* Add options until we hit the end of the line...
*/
dest->num_options = cupsParseOptions(lineptr, dest->num_options,
&(dest->options));
/*
* Set this as default if needed...
*/
if (strncasecmp(line, "default", 7) == 0 && printer == NULL)
{
for (i = 0; i < num_dests; i ++)
(*dests)[i].is_default = 0;
dest->is_default = 1;
}
}
/*
* Close the file and return...
*/
fclose(fp);
return (num_dests);
}
/*
* 'cups_get_sdests()' - Get destinations from a server.
*/
static int /* O - Number of destinations */
cups_get_sdests(ipp_op_t op, /* I - get-printers or get-classes */
int num_dests, /* I - Number of destinations */
cups_dest_t **dests) /* IO - Destinations */
{
cups_dest_t *dest; /* Current destination */
http_t *http; /* HTTP connection */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
const char *name; /* printer-name attribute */
char job_sheets[1024]; /* job-sheets option */
static const char * const pattrs[] = /* Attributes we're interested in */
{
"printer-name",
"job-sheets-default"
};
/*
* Connect to the CUPS server...
*/
if ((http = httpConnect(cupsServer(), ippPort())) == NULL)
return (num_dests);
/*
* Build a CUPS_GET_PRINTERS or CUPS_GET_CLASSES request, which require
* the following attributes:
*
* attributes-charset
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = op;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
cupsLangFree(language);
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
"requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]),
NULL, pattrs);
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(http, request, "/")) != NULL)
{
for (attr = response->attrs; attr != NULL; attr = attr->next)
{
/*
* Skip leading attributes until we hit a printer...
*/
while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER)
attr = attr->next;
if (attr == NULL)
break;
/*
* Pull the needed attributes from this job...
*/
name = NULL;
strcpy(job_sheets, "");
while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER)
{
if (strcmp(attr->name, "printer-name") == 0 &&
attr->value_tag == IPP_TAG_NAME)
name = attr->values[0].string.text;
if (strcmp(attr->name, "job-sheets-default") == 0 &&
(attr->value_tag == IPP_TAG_KEYWORD ||
attr->value_tag == IPP_TAG_NAME))
{
if (attr->num_values == 2)
snprintf(job_sheets, sizeof(job_sheets), "%s,%s",
attr->values[0].string.text, attr->values[1].string.text);
else
strcpy(job_sheets, attr->values[0].string.text);
}
attr = attr->next;
}
/*
* See if we have everything needed...
*/
if (!name)
{
if (attr == NULL)
break;
else
continue;
}
num_dests = cupsAddDest(name, NULL, num_dests, dests);
if ((dest = cupsGetDest(name, NULL, num_dests, *dests)) != NULL)
if (job_sheets[0])
dest->num_options = cupsAddOption("job-sheets", job_sheets, 0,
&(dest->options));
if (attr == NULL)
break;
}
ippDelete(response);
}
/*
* Close the server connection...
*/
httpClose(http);
/*
* Return the count...
*/
return (num_dests);
}
/*
* End of "$Id$".
*/
+598 -167
Ver Arquivo
@@ -3,7 +3,7 @@
*
* PPD code emission routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
@@ -23,10 +23,17 @@
*
* PostScript is a trademark of Adobe Systems, Inc.
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* ppdEmit() - Emit code for marked options to a file.
* ppdEmitFd() - Emit code for marked options to a file.
* ppdCollect() - Collect all marked options that reside in the
* specified section.
* ppdEmit() - Emit code for marked options to a file.
* ppdEmitFd() - Emit code for marked options to a file.
* ppdEmitJCL() - Emit code for JCL options to a file.
* ppd_handle_media() - Handle media selection...
* ppd_sort() - Sort options by ordering numbers...
*/
/*
@@ -48,181 +55,28 @@
* Local functions...
*/
static void ppd_handle_media(ppd_file_t *ppd);
static int ppd_sort(ppd_choice_t **c1, ppd_choice_t **c2);
static int ppd_collect(ppd_file_t *ppd, ppd_section_t section,
ppd_choice_t ***choices);
/*
* 'ppdEmit()' - Emit code for marked options to a file.
* Local globals...
*/
int /* O - 0 on success, -1 on failure */
ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
FILE *fp, /* I - File to write to */
ppd_section_t section) /* I - Section to write */
{
int i, /* Looping var */
count; /* Number of choices */
ppd_choice_t **choices; /* Choices */
ppd_size_t *size; /* Custom page size */
if ((count = ppd_collect(ppd, section, &choices)) == 0)
return (0);
for (i = 0; i < count; i ++)
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
{
/*
* Send DSC comments with option...
*/
if (fprintf(fp, "%%%%BeginFeature: %s %s\n",
((ppd_option_t *)choices[i]->option)->keyword,
choices[i]->choice) < 0)
{
free(choices);
return (-1);
}
if (strcmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 &&
strcmp(choices[i]->choice, "Custom") == 0)
{
/*
* Variable size; write out standard size options (this should
* eventually be changed to use the parameter positions defined
* in the PPD file...)
*/
size = ppdPageSize(ppd, "Custom");
fprintf(fp, "%.0f %.0f 0 0 0\n", size->width, size->length);
if (choices[i]->code == NULL)
{
/*
* This can happen with certain buggy PPD files that don't include
* a CustomPageSize command sequence... We just use a generic
* Level 2 command sequence...
*/
fputs("pop pop pop\n", fp);
fputs("<</PageSize[7 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
}
}
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
{
if (fputs(choices[i]->code, fp) < 0)
{
free(choices);
return (-1);
}
if (choices[i]->code[strlen(choices[i]->code) - 1] != '\n')
putc('\n', fp);
}
if (fputs("%%EndFeature\n", fp) < 0)
{
free(choices);
return (-1);
}
}
else if (fputs(choices[i]->code, fp) < 0)
{
free(choices);
return (-1);
}
free(choices);
return (0);
}
static const char *ppd_custom_code =
"pop pop pop\n"
"<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n";
/*
* 'ppdEmitFd()' - Emit code for marked options to a file.
* 'ppdCollect()' - Collect all marked options that reside in the specified
* section.
*/
int /* O - 0 on success, -1 on failure */
ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
int fd, /* I - File to write to */
ppd_section_t section) /* I - Section to write */
{
int i, /* Looping var */
count; /* Number of choices */
ppd_choice_t **choices; /* Choices */
char buf[1024]; /* Output buffer for feature */
if ((count = ppd_collect(ppd, section, &choices)) == 0)
return (0);
for (i = 0; i < count; i ++)
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
{
/*
* Send DSC comments with option...
*/
sprintf(buf, "%%%%BeginFeature: %s %s\n",
((ppd_option_t *)choices[i]->option)->keyword, choices[i]->choice);
if (write(fd, buf, strlen(buf)) < 1)
{
free(choices);
return (-1);
}
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
{
free(choices);
return (-1);
}
if (write(fd, "%%EndFeature\n", 13) < 1)
{
free(choices);
return (-1);
}
}
else if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
{
free(choices);
return (-1);
}
free(choices);
return (0);
}
/*
* 'ppd_sort()' - Sort options by ordering numbers...
*/
static int /* O - -1 if c1 < c2, 0 if equal, 1 otherwise */
ppd_sort(ppd_choice_t **c1, /* I - First choice */
ppd_choice_t **c2) /* I - Second choice */
{
if (((ppd_option_t *)(*c1)->option)->order < ((ppd_option_t *)(*c2)->option)->order)
return (-1);
else if (((ppd_option_t *)(*c1)->option)->order > ((ppd_option_t *)(*c2)->option)->order)
return (1);
else
return (0);
}
/*
* 'ppd_collect()' - Collect all marked options that reside in the specified
* section.
*/
static int /* O - Number of options marked */
ppd_collect(ppd_file_t *ppd, /* I - PPD file data */
ppd_section_t section, /* I - Section to collect */
ppd_choice_t ***choices) /* O - Pointers to choices */
int /* O - Number of options marked */
ppdCollect(ppd_file_t *ppd, /* I - PPD file data */
ppd_section_t section, /* I - Section to collect */
ppd_choice_t ***choices) /* O - Pointers to choices */
{
int i, j, k, m; /* Looping vars */
ppd_group_t *g, /* Current group */
@@ -296,6 +150,583 @@ ppd_collect(ppd_file_t *ppd, /* I - PPD file data */
}
/*
* 'ppdEmit()' - Emit code for marked options to a file.
*/
int /* O - 0 on success, -1 on failure */
ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
FILE *fp, /* I - File to write to */
ppd_section_t section) /* I - Section to write */
{
int i, /* Looping var */
count; /* Number of choices */
ppd_choice_t **choices; /* Choices */
ppd_size_t *size; /* Custom page size */
/*
* Use PageSize or PageRegion as required...
*/
ppd_handle_media(ppd);
/*
* Collect the options we need to emit and emit them!
*/
if ((count = ppdCollect(ppd, section, &choices)) == 0)
return (0);
for (i = 0; i < count; i ++)
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
{
/*
* Send wrapper commands to prevent printer errors for unsupported
* options...
*/
if (fputs("[{\n", fp) < 0)
{
free(choices);
return (-1);
}
/*
* Send DSC comments with option...
*/
if ((strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 ||
strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageRegion") == 0) &&
strcasecmp(choices[i]->choice, "Custom") == 0)
{
/*
* Variable size; write out standard size options, using the
* parameter positions defined in the PPD file...
*/
ppd_attr_t *attr; /* PPD attribute */
int pos, /* Position of custom value */
values[5], /* Values for custom command */
orientation; /* Orientation to use */
fputs("%%BeginFeature: *CustomPageSize True\n", fp);
size = ppdPageSize(ppd, "Custom");
memset(values, 0, sizeof(values));
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL)
{
pos = atoi(attr->value) - 1;
if (pos < 0 || pos > 4)
pos = 0;
}
else
pos = 0;
values[pos] = (int)size->width;
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL)
{
pos = atoi(attr->value) - 1;
if (pos < 0 || pos > 4)
pos = 1;
}
else
pos = 1;
values[pos] = (int)size->length;
if (size->width < size->length)
orientation = 1;
else
orientation = 0;
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize",
"Orientation")) != NULL)
{
int min_orient, max_orient; /* Minimum and maximum orientations */
if (sscanf(attr->value, "%d%*s%d%d", &pos, &min_orient,
&max_orient) != 3)
pos = 4;
else
{
pos --;
if (pos < 0 || pos > 4)
pos = 4;
if (orientation > max_orient)
orientation = max_orient;
else if (orientation < min_orient)
orientation = min_orient;
}
}
else
pos = 4;
values[pos] = orientation;
fprintf(fp, "%d %d %d %d %d\n", values[0], values[1],
values[2], values[3], values[4]);
if (choices[i]->code == NULL)
{
/*
* This can happen with certain buggy PPD files that don't include
* a CustomPageSize command sequence... We just use a generic
* Level 2 command sequence...
*/
fputs(ppd_custom_code, fp);
}
}
else if (fprintf(fp, "%%%%BeginFeature: *%s %s\n",
((ppd_option_t *)choices[i]->option)->keyword,
choices[i]->choice) < 0)
{
free(choices);
return (-1);
}
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
{
if (fputs(choices[i]->code, fp) < 0)
{
free(choices);
return (-1);
}
if (choices[i]->code[strlen(choices[i]->code) - 1] != '\n')
putc('\n', fp);
}
if (fputs("%%EndFeature\n", fp) < 0)
{
free(choices);
return (-1);
}
if (fputs("} stopped cleartomark\n", fp) < 0)
{
free(choices);
return (-1);
}
}
else if (fputs(choices[i]->code, fp) < 0)
{
free(choices);
return (-1);
}
free(choices);
return (0);
}
/*
* 'ppdEmitFd()' - Emit code for marked options to a file.
*/
int /* O - 0 on success, -1 on failure */
ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
int fd, /* I - File to write to */
ppd_section_t section) /* I - Section to write */
{
int i, /* Looping var */
count, /* Number of choices */
custom_size; /* Non-zero if this option is a custom size */
ppd_choice_t **choices; /* Choices */
ppd_size_t *size; /* Custom page size */
char buf[1024]; /* Output buffer for feature */
/*
* Use PageSize or PageRegion as required...
*/
ppd_handle_media(ppd);
/*
* Collect the options we need to emit and emit them!
*/
if ((count = ppdCollect(ppd, section, &choices)) == 0)
return (0);
for (i = 0; i < count; i ++)
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
{
/*
* Send wrapper commands to prevent printer errors for unsupported
* options...
*/
if (write(fd, "[{\n", 3) < 1)
{
free(choices);
return (-1);
}
/*
* Send DSC comments with option...
*/
if ((strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 ||
strcasecmp(((ppd_option_t *)choices[i]->option)->keyword, "PageRegion") == 0) &&
strcasecmp(choices[i]->choice, "Custom") == 0)
{
custom_size = 1;
strcpy(buf, "%%BeginFeature: *CustomPageSize True\n");
}
else
{
custom_size = 0;
snprintf(buf, sizeof(buf), "%%%%BeginFeature: *%s %s\n",
((ppd_option_t *)choices[i]->option)->keyword,
choices[i]->choice);
}
if (write(fd, buf, strlen(buf)) < 1)
{
free(choices);
return (-1);
}
if (custom_size)
{
/*
* Variable size; write out standard size options, using the
* parameter positions defined in the PPD file...
*/
ppd_attr_t *attr; /* PPD attribute */
int pos, /* Position of custom value */
values[5], /* Values for custom command */
orientation; /* Orientation to use */
size = ppdPageSize(ppd, "Custom");
memset(values, 0, sizeof(values));
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL)
{
pos = atoi(attr->value) - 1;
if (pos < 0 || pos > 4)
pos = 0;
}
else
pos = 0;
values[pos] = (int)size->width;
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL)
{
pos = atoi(attr->value) - 1;
if (pos < 0 || pos > 4)
pos = 1;
}
else
pos = 1;
values[pos] = (int)size->length;
if (size->width < size->length)
orientation = 1;
else
orientation = 0;
if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize",
"Orientation")) != NULL)
{
int min_orient, max_orient; /* Minimum and maximum orientations */
if (sscanf(attr->value, "%d%*s%d%d", &pos, &min_orient,
&max_orient) != 3)
pos = 4;
else
{
pos --;
if (pos < 0 || pos > 4)
pos = 4;
if (orientation > max_orient)
orientation = max_orient;
else if (orientation < min_orient)
orientation = min_orient;
}
}
else
pos = 4;
values[pos] = orientation;
snprintf(buf, sizeof(buf), "%d %d %d %d %d\n", values[0], values[1],
values[2], values[3], values[4]);
if (write(fd, buf, strlen(buf)) < 1)
{
free(choices);
return (-1);
}
if (choices[i]->code == NULL)
{
/*
* This can happen with certain buggy PPD files that don't include
* a CustomPageSize command sequence... We just use a generic
* Level 2 command sequence...
*/
if (write(fd, ppd_custom_code, strlen(ppd_custom_code)) < 1)
{
free(choices);
return (-1);
}
}
}
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
{
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
{
free(choices);
return (-1);
}
}
if (write(fd, "%%EndFeature\n", 13) < 1)
{
free(choices);
return (-1);
}
if (write(fd, "} stopped cleartomark\n", 22) < 1)
{
free(choices);
return (-1);
}
}
else if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
{
free(choices);
return (-1);
}
free(choices);
return (0);
}
/*
* 'ppdEmitJCL()' - Emit code for JCL options to a file.
*/
int /* O - 0 on success, -1 on failure */
ppdEmitJCL(ppd_file_t *ppd, /* I - PPD file record */
FILE *fp, /* I - File to write to */
int job_id, /* I - Job ID */
const char *user, /* I - Username */
const char *title) /* I - Title */
{
char *ptr; /* Pointer into JCL string */
char temp[81]; /* Local title string */
/*
* Range check the input...
*/
if (ppd == NULL || ppd->jcl_begin == NULL || ppd->jcl_ps == NULL)
return (0);
/*
* See if the printer supports HP PJL...
*/
if (strncmp(ppd->jcl_begin, "\033%-12345X@", 10) == 0)
{
/*
* This printer uses HP PJL commands for output; filter the output
* so that we only have a single "@PJL JOB" command in the header...
*
* To avoid bugs in the PJL implementation of certain vendors' products
* (Xerox in particular), we add a dummy "@PJL" command at the beginning
* of the PJL commands to initialize PJL processing.
*/
fputs("\033%-12345X@PJL\n", fp);
for (ptr = ppd->jcl_begin + 9; *ptr;)
if (strncmp(ptr, "@PJL JOB", 8) == 0)
{
/*
* Skip job command...
*/
for (;*ptr; ptr ++)
if (*ptr == '\n')
break;
if (*ptr)
ptr ++;
}
else
{
/*
* Copy line...
*/
for (;*ptr; ptr ++)
{
putc(*ptr, fp);
if (*ptr == '\n')
break;
}
if (*ptr)
ptr ++;
}
/*
* Eliminate any path info from the job title...
*/
if ((ptr = strrchr(title, '/')) != NULL)
title = ptr + 1;
/*
* Replace double quotes with single quotes so that the title
* does not cause a PJL syntax error.
*/
strlcpy(temp, title, sizeof(temp));
for (ptr = temp; *ptr; ptr ++)
if (*ptr == '\"')
*ptr = '\'';
/*
* Send PJL JOB command before we enter PostScript mode...
*/
fprintf(fp, "@PJL JOB NAME = \"%s\" DISPLAY = \"%d %s %s\"\n", temp,
job_id, user, temp);
}
else
fputs(ppd->jcl_begin, fp);
ppdEmit(ppd, fp, PPD_ORDER_JCL);
fputs(ppd->jcl_ps, fp);
return (0);
}
/*
* 'ppd_handle_media()' - Handle media selection...
*/
static void
ppd_handle_media(ppd_file_t *ppd)
{
ppd_choice_t *manual_feed, /* ManualFeed choice, if any */
*input_slot, /* InputSlot choice, if any */
*page; /* PageSize/PageRegion */
ppd_size_t *size; /* Current media size */
ppd_attr_t *rpr; /* RequiresPageRegion value */
/*
* This function determines if the user has selected a media source
* via the InputSlot or ManualFeed options; if so, it marks the
* PageRegion option corresponding to the current media size.
* Otherwise it marks the PageSize option.
*/
if ((size = ppdPageSize(ppd, NULL)) == NULL)
return;
manual_feed = ppdFindMarkedChoice(ppd, "ManualFeed");
input_slot = ppdFindMarkedChoice(ppd, "InputSlot");
if (input_slot != NULL)
rpr = ppdFindAttr(ppd, "RequiresPageRegion", input_slot->choice);
else
rpr = NULL;
if (!rpr)
rpr = ppdFindAttr(ppd, "RequiresPageRegion", "All");
if (strcasecmp(size->name, "Custom") == 0 ||
(manual_feed == NULL && input_slot == NULL) ||
(manual_feed != NULL && strcasecmp(manual_feed->choice, "False") == 0) ||
(input_slot != NULL && (input_slot->code == NULL || !input_slot->code[0])))
{
/*
* Manual feed was not selected and/or the input slot selection does
* not contain any PostScript code. Use the PageSize option...
*/
ppdMarkOption(ppd, "PageSize", size->name);
}
else
{
/*
* Manual feed was selected and/or the input slot selection contains
* PostScript code. Use the PageRegion option...
*/
ppdMarkOption(ppd, "PageRegion", size->name);
if ((rpr && rpr->value && !strcmp(rpr->value, "False")) ||
(!rpr && !ppd->num_filters))
{
/*
* Either the PPD file specifies no PageRegion code or the PPD file
* not for a CUPS raster driver and thus defaults to no PageRegion
* code... Unmark the PageRegion choice so that we don't output the
* code...
*/
page = ppdFindMarkedChoice(ppd, "PageRegion");
if (page)
page->marked = 0;
}
}
}
/*
* 'ppd_sort()' - Sort options by ordering numbers...
*/
static int /* O - -1 if c1 < c2, 0 if equal, 1 otherwise */
ppd_sort(ppd_choice_t **c1, /* I - First choice */
ppd_choice_t **c2) /* I - Second choice */
{
if (((ppd_option_t *)(*c1)->option)->order < ((ppd_option_t *)(*c2)->option)->order)
return (-1);
else if (((ppd_option_t *)(*c1)->option)->order > ((ppd_option_t *)(*c2)->option)->order)
return (1);
else
return (0);
}
/*
* End of "$Id$".
*/
+388
Ver Arquivo
@@ -0,0 +1,388 @@
/*
* "$Id$"
*
* Option encoding routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* cupsEncodeOptions() - Encode printer options into IPP attributes.
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include <stdlib.h>
#include <ctype.h>
#include "string.h"
#include "debug.h"
/*
* Local list of option names and the value tags they should use...
*/
typedef struct
{
const char *name;
ipp_tag_t value_tag;
} ipp_option_t;
static const ipp_option_t ipp_options[] =
{
{ "blackplot", IPP_TAG_BOOLEAN },
{ "brightness", IPP_TAG_INTEGER },
{ "columns", IPP_TAG_INTEGER },
{ "copies", IPP_TAG_INTEGER },
{ "finishings", IPP_TAG_ENUM },
{ "fitplot", IPP_TAG_BOOLEAN },
{ "gamma", IPP_TAG_INTEGER },
{ "hue", IPP_TAG_INTEGER },
{ "job-k-limit", IPP_TAG_INTEGER },
{ "job-page-limit", IPP_TAG_INTEGER },
{ "job-priority", IPP_TAG_INTEGER },
{ "job-quota-period", IPP_TAG_INTEGER },
{ "landscape", IPP_TAG_BOOLEAN },
{ "media", IPP_TAG_KEYWORD },
{ "mirror", IPP_TAG_BOOLEAN },
{ "natural-scaling", IPP_TAG_INTEGER },
{ "number-up", IPP_TAG_INTEGER },
{ "orientation-requested", IPP_TAG_ENUM },
{ "page-bottom", IPP_TAG_INTEGER },
{ "page-left", IPP_TAG_INTEGER },
{ "page-ranges", IPP_TAG_RANGE },
{ "page-right", IPP_TAG_INTEGER },
{ "page-top", IPP_TAG_INTEGER },
{ "penwidth", IPP_TAG_INTEGER },
{ "ppi", IPP_TAG_INTEGER },
{ "prettyprint", IPP_TAG_BOOLEAN },
{ "printer-resolution", IPP_TAG_RESOLUTION },
{ "print-quality", IPP_TAG_ENUM },
{ "saturation", IPP_TAG_INTEGER },
{ "scaling", IPP_TAG_INTEGER },
{ "sides", IPP_TAG_KEYWORD },
{ "wrap", IPP_TAG_BOOLEAN }
};
/*
* 'cupsEncodeOptions()' - Encode printer options into IPP attributes.
*/
void
cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */
int num_options, /* I - Number of options */
cups_option_t *options) /* I - Options */
{
int i, j; /* Looping vars */
int count; /* Number of values */
char *s, /* Pointer into option value */
*val, /* Pointer to option value */
*copy, /* Copy of option value */
*sep; /* Option separator */
ipp_attribute_t *attr; /* IPP job-id attribute */
DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)\n", ipp, num_options, options));
if (ipp == NULL || num_options < 1 || options == NULL)
return;
/*
* Handle the document format stuff first...
*/
if ((val = (char *)cupsGetOption("document-format", num_options, options)) != NULL)
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
NULL, val);
else if (cupsGetOption("raw", num_options, options))
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
NULL, "application/vnd.cups-raw");
else
ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
NULL, "application/octet-stream");
/*
* Then add all other options...
*/
for (i = 0; i < num_options; i ++)
{
/*
* Skip document format options - handled above...
*/
if (strcasecmp(options[i].name, "raw") == 0 ||
strcasecmp(options[i].name, "document-format") == 0 ||
!options[i].name[0])
continue;
/*
* Count the number of values...
*/
for (count = 1, sep = options[i].value; *sep; sep ++)
{
if (*sep == '\'')
{
/*
* Skip quoted option value...
*/
sep ++;
while (*sep && *sep != '\'')
sep ++;
if (!*sep)
sep --;
}
else if (*sep == '\"')
{
/*
* Skip quoted option value...
*/
sep ++;
while (*sep && *sep != '\"')
sep ++;
if (!*sep)
sep --;
}
else if (*sep == ',')
count ++;
else if (*sep == '\\' && sep[1])
sep ++;
}
DEBUG_printf(("cupsEncodeOptions: option = \'%s\', count = %d\n",
options[i].name, count));
/*
* Allocate memory for the attribute values...
*/
if ((attr = _ipp_add_attr(ipp, count)) == NULL)
{
/*
* Ran out of memory!
*/
DEBUG_puts("cupsEncodeOptions: Ran out of memory for attributes!");
return;
}
/*
* Now figure out what type of value we have...
*/
attr->group_tag = IPP_TAG_JOB;
if (strcasecmp(options[i].value, "true") == 0 ||
strcasecmp(options[i].value, "false") == 0)
attr->value_tag = IPP_TAG_BOOLEAN;
else
attr->value_tag = IPP_TAG_NAME;
for (j = 0; j < (int)(sizeof(ipp_options) / sizeof(ipp_options[0])); j ++)
if (strcasecmp(options[i].name, ipp_options[j].name) == 0)
{
attr->value_tag = ipp_options[j].value_tag;
break;
}
/*
* Copy the name over...
*/
if ((attr->name = strdup(options[i].name)) == NULL)
{
/*
* Ran out of memory!
*/
DEBUG_puts("cupsEncodeOptions: Ran out of memory for name!");
return;
}
if (count > 1)
{
/*
* Make a copy of the value we can fiddle with...
*/
if ((copy = strdup(options[i].value)) == NULL)
{
/*
* Ran out of memory!
*/
DEBUG_puts("cupsEncodeOptions: Ran out of memory for value copy!");
return;
}
val = copy;
}
else
{
/*
* Since we have a single value, use the value directly...
*/
val = options[i].value;
copy = NULL;
}
/*
* Scan the value string for values...
*/
for (j = 0; j < count; val = sep, j ++)
{
/*
* Find the end of this value and mark it if needed...
*/
if ((sep = strchr(val, ',')) != NULL)
*sep++ = '\0';
else
sep = val + strlen(val);
/*
* Copy the option value(s) over as needed by the type...
*/
switch (attr->value_tag)
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
/*
* Integer/enumeration value...
*/
attr->values[j].integer = strtol(val, &s, 0);
DEBUG_printf(("cupsEncodeOptions: Adding integer option value %d...\n",
attr->values[j].integer));
break;
case IPP_TAG_BOOLEAN :
if (!strcasecmp(val, "true") ||
!strcasecmp(val, "on") ||
!strcasecmp(val, "yes"))
{
/*
* Boolean value - true...
*/
attr->values[j].boolean = 1;
DEBUG_puts("cupsEncodeOptions: Added boolean true value...");
}
else
{
/*
* Boolean value - false...
*/
attr->values[j].boolean = 0;
DEBUG_puts("cupsEncodeOptions: Added boolean false value...");
}
break;
case IPP_TAG_RANGE :
/*
* Range...
*/
if (*val == '-')
{
attr->values[j].range.lower = 1;
s = val;
}
else
attr->values[j].range.lower = strtol(val, &s, 0);
if (*s == '-')
{
if (s[1])
attr->values[j].range.upper = strtol(s + 1, NULL, 0);
else
attr->values[j].range.upper = 2147483647;
}
else
attr->values[j].range.upper = attr->values[j].range.lower;
DEBUG_printf(("cupsEncodeOptions: Added range option value %d-%d...\n",
attr->values[j].range.lower,
attr->values[j].range.upper));
break;
case IPP_TAG_RESOLUTION :
/*
* Resolution...
*/
attr->values[j].resolution.xres = strtol(val, &s, 0);
if (*s == 'x')
attr->values[j].resolution.yres = strtol(s + 1, &s, 0);
else
attr->values[j].resolution.yres = attr->values[j].resolution.xres;
if (strcasecmp(s, "dpc") == 0)
attr->values[j].resolution.units = IPP_RES_PER_CM;
else
attr->values[j].resolution.units = IPP_RES_PER_INCH;
DEBUG_printf(("cupsEncodeOptions: Adding resolution option value %s...\n",
val));
break;
default :
if ((attr->values[j].string.text = strdup(val)) == NULL)
{
/*
* Ran out of memory!
*/
DEBUG_puts("cupsEncodeOptions: Ran out of memory for string!");
return;
}
DEBUG_printf(("cupsEncodeOptions: Added string value \'%s\'...\n",
val));
break;
}
}
}
}
/*
* End of "$Id$".
*/
+435
Ver Arquivo
@@ -0,0 +1,435 @@
/*
* "$Id$"
*
* Get/put file functions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* cupsGetFd() - Get a file from the server.
* cupsGetFile() - Get a file from the server.
* cupsPutFd() - Put a file on the server.
* cupsPutFile() - Put a file on the server.
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include "ipp.h"
#include "language.h"
#include "string.h"
#include "debug.h"
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#if defined(WIN32) || defined(__EMX__)
# include <io.h>
#else
# include <unistd.h>
#endif /* WIN32 || __EMX__ */
/*
* 'cupsGetFd()' - Get a file from the server.
*/
http_status_t /* O - Status */
cupsGetFd(http_t *http, /* I - HTTP connection to server */
const char *resource, /* I - Resource name */
int fd) /* I - File descriptor */
{
int bytes; /* Number of bytes read */
char buffer[8192]; /* Buffer for file */
http_status_t status; /* HTTP status from server */
/*
* Range check input...
*/
if (!http || !resource || fd < 0)
{
if (http)
http->error = EINVAL;
return (HTTP_ERROR);
}
/*
* Then send GET requests to the HTTP server...
*/
do
{
httpClearFields(http);
httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring);
if (httpGet(http, resource))
{
if (httpReconnect(http))
{
status = HTTP_ERROR;
break;
}
else
{
status = HTTP_UNAUTHORIZED;
continue;
}
}
while ((status = httpUpdate(http)) == HTTP_CONTINUE);
if (status == HTTP_UNAUTHORIZED)
{
/*
* Flush any error message...
*/
httpFlush(http);
/*
* See if we can do authentication...
*/
if (cupsDoAuthentication(http, "GET", resource))
break;
httpReconnect(http);
continue;
}
else if (status == HTTP_ERROR)
{
#ifdef WIN32
if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH)
#else
if (http->error != ENETDOWN && http->error != ENETUNREACH)
#endif /* WIN32 */
continue;
else
break;
}
#ifdef HAVE_LIBSSL
else if (status == HTTP_UPGRADE_REQUIRED)
{
/*
* Flush any error message...
*/
httpFlush(http);
/*
* Upgrade with encryption...
*/
httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
/*
* Try again, this time with encryption enabled...
*/
continue;
}
#endif /* HAVE_LIBSSL */
}
while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED ||
status == HTTP_ERROR);
/*
* See if we actually got the file or an error...
*/
if (status == HTTP_OK)
{
/*
* Yes, copy the file...
*/
while ((bytes = httpRead(http, buffer, sizeof(buffer))) > 0)
write(fd, buffer, bytes);
}
else
httpFlush(http);
/*
* Return the request status...
*/
return (status);
}
/*
* 'cupsGetFile()' - Get a file from the server.
*/
http_status_t /* O - Status */
cupsGetFile(http_t *http, /* I - HTTP connection to server */
const char *resource, /* I - Resource name */
const char *filename) /* I - Filename */
{
int fd; /* File descriptor */
http_status_t status; /* Status */
/*
* Range check input...
*/
if (!http || !resource || !filename)
{
if (http)
http->error = EINVAL;
return (HTTP_ERROR);
}
/*
* Create the file...
*/
if ((fd = open(filename, O_WRONLY | O_EXCL | O_TRUNC)) < 0)
{
/*
* Couldn't open the file!
*/
http->error = errno;
return (HTTP_ERROR);
}
/*
* Get the file...
*/
status = cupsGetFd(http, resource, fd);
/*
* If the file couldn't be gotten, then remove the file...
*/
close(fd);
if (status != HTTP_OK)
unlink(filename);
/*
* Return the HTTP status code...
*/
return (status);
}
/*
* 'cupsPutFd()' - Put a file on the server.
*/
http_status_t /* O - Status */
cupsPutFd(http_t *http, /* I - HTTP connection to server */
const char *resource, /* I - Resource name */
int fd) /* I - File descriptor */
{
int bytes; /* Number of bytes read */
char buffer[8192]; /* Buffer for file */
http_status_t status; /* HTTP status from server */
/*
* Range check input...
*/
if (!http || !resource || fd < 0)
{
if (http)
http->error = EINVAL;
return (HTTP_ERROR);
}
/*
* Then send PUT requests to the HTTP server...
*/
do
{
httpClearFields(http);
httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring);
httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked");
if (httpPut(http, resource))
{
if (httpReconnect(http))
{
status = HTTP_ERROR;
break;
}
else
{
status = HTTP_UNAUTHORIZED;
continue;
}
}
/*
* Copy the file...
*/
lseek(fd, 0, SEEK_SET);
status = HTTP_CONTINUE;
while ((bytes = read(fd, buffer, sizeof(buffer))) > 0)
if (httpCheck(http))
{
if ((status = httpUpdate(http)) != HTTP_CONTINUE)
break;
}
else
httpWrite(http, buffer, bytes);
if (status == HTTP_CONTINUE)
{
httpWrite(http, buffer, 0);
while ((status = httpUpdate(http)) == HTTP_CONTINUE);
}
if (status == HTTP_UNAUTHORIZED)
{
/*
* Flush any error message...
*/
httpFlush(http);
/*
* See if we can do authentication...
*/
if (cupsDoAuthentication(http, "PUT", resource))
break;
httpReconnect(http);
continue;
}
else if (status == HTTP_ERROR)
{
#ifdef WIN32
if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH)
#else
if (http->error != ENETDOWN && http->error != ENETUNREACH)
#endif /* WIN32 */
continue;
else
break;
}
#ifdef HAVE_LIBSSL
else if (status == HTTP_UPGRADE_REQUIRED)
{
/* Flush any error message... */
httpFlush(http);
/* Upgrade with encryption... */
httpEncryption(http, HTTP_ENCRYPT_REQUIRED);
/* Try again, this time with encryption enabled... */
continue;
}
#endif /* HAVE_LIBSSL */
}
while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED ||
status == HTTP_ERROR);
/*
* See if we actually put the file or an error...
*/
if (status != HTTP_CREATED)
httpFlush(http);
return (status);
}
/*
* 'cupsPutFile()' - Put a file on the server.
*/
http_status_t /* O - Status */
cupsPutFile(http_t *http, /* I - HTTP connection to server */
const char *resource, /* I - Resource name */
const char *filename) /* I - Filename */
{
int fd; /* File descriptor */
http_status_t status; /* Status */
/*
* Range check input...
*/
if (!http || !resource || !filename)
{
if (http)
http->error = EINVAL;
return (HTTP_ERROR);
}
/*
* Open the local file...
*/
if ((fd = open(filename, O_RDONLY)) < 0)
{
/*
* Couldn't open the file!
*/
http->error = errno;
return (HTTP_ERROR);
}
/*
* Put the file...
*/
status = cupsPutFd(http, resource, fd);
close(fd);
return (status);
}
/*
* End of "$Id$".
*/
+119
Ver Arquivo
@@ -0,0 +1,119 @@
/*
* "$Id$"
*
* HTTP host/address routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* httpGetHostByName() - Lookup a hostname or IP address, and return
* address records for the specified name.
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "string.h"
#include "http.h"
/*
* 'httpGetHostByName()' - Lookup a hostname or IP address, and return
* address records for the specified name.
*/
struct hostent * /* O - Host entry */
httpGetHostByName(const char *name) /* I - Hostname or IP address */
{
const char *nameptr; /* Pointer into name */
unsigned ip[4]; /* IP address components */
static unsigned packed_ip; /* Packed IPv4 address */
static char *packed_ptr[2]; /* Pointer to packed address */
static struct hostent host_ip; /* Host entry for IP address */
#if defined(__APPLE__)
/* OS X hack to avoid it's ocassional long delay in lookupd */
static const char sLoopback[] = "127.0.0.1";
if (strcmp(name, "localhost") == 0)
name = sLoopback;
#endif /* __APPLE__ */
/*
* This function is needed because some operating systems have a
* buggy implementation of gethostbyname() that does not support
* IP addresses. If the first character of the name string is a
* number, then sscanf() is used to extract the IP components.
* We then pack the components into an IPv4 address manually,
* since the inet_aton() function is deprecated. We use the
* htonl() macro to get the right byte order for the address.
*/
for (nameptr = name; isdigit(*nameptr) || *nameptr == '.'; nameptr ++);
if (!*nameptr)
{
/*
* We have an IP address; break it up and provide the host entry
* to the caller. Currently only supports IPv4 addresses, although
* it should be trivial to support IPv6 in CUPS 1.2.
*/
if (sscanf(name, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) != 4)
return (NULL); /* Must have 4 numbers */
packed_ip = htonl(((((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8) | ip[3]));
/*
* Fill in the host entry and return it...
*/
host_ip.h_name = (char *)name;
host_ip.h_aliases = NULL;
host_ip.h_addrtype = AF_INET;
host_ip.h_length = 4;
host_ip.h_addr_list = packed_ptr;
packed_ptr[0] = (char *)(&packed_ip);
packed_ptr[1] = NULL;
return (&host_ip);
}
else
{
/*
* Use the gethostbyname() function to get the IP address for
* the name...
*/
return (gethostbyname(name));
}
}
/*
* End of "$Id$".
*/
+102
Ver Arquivo
@@ -0,0 +1,102 @@
/*
* "$Id$"
*
* Private HTTP definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*/
#ifndef _CUPS_HTTP_PRIVATE_H_
# define _CUPS_HTTP_PRIVATE_H_
/*
* Include necessary headers...
*/
# include "config.h"
# ifdef __sun
/*
* Define FD_SETSIZE to CUPS_MAX_FDS on Solaris to get the correct version of
* select() for large numbers of file descriptors.
*/
# define FD_SETSIZE CUPS_MAX_FDS
# include <sys/select.h>
# endif /* __sun */
# include "http.h"
# if defined HAVE_LIBSSL
/*
* The OpenSSL library provides its own SSL/TLS context structure for its
* IO and protocol management...
*/
# include <openssl/err.h>
# include <openssl/rand.h>
# include <openssl/ssl.h>
typedef SSL http_tls_t;
# elif defined HAVE_GNUTLS
/*
* The GNU TLS library is more of a "bare metal" SSL/TLS library...
*/
# include <gnutls/gnutls.h>
typedef struct
{
gnutls_session session; /* GNU TLS session object */
void *credentials; /* GNU TLS credentials object */
} http_tls_t;
# elif defined(HAVE_CDSASSL)
/*
* Darwin's Security framework provides its own SSL/TLS context structure
* for its IO and protocol management...
*/
# include <Security/SecureTransport.h>
typedef SSLConnectionRef http_tls_t;
# endif /* HAVE_LIBSSL */
/*
* Some OS's don't have hstrerror(), most notably Solaris...
*/
# ifndef HAVE_HSTRERROR
extern const char *cups_hstrerror(int error);
# define hstrerror cups_hstrerror
# elif defined(_AIX)
/*
* AIX doesn't provide a prototype but does provide the function...
*/
extern const char *hstrerror(int error);
# endif /* !HAVE_HSTRERROR */
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
/*
* End of "$Id$".
*/
+345
Ver Arquivo
@@ -0,0 +1,345 @@
/*
* "$Id$"
*
* HTTP support routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-2003 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This file is subject to the Apple OS-Developed Software exception.
*
* Contents:
*
* httpSeparate() - Separate a Universal Resource Identifier into its
* components.
* httpStatus() - Return a short string describing a HTTP status code.
* cups_hstrerror() - hstrerror() emulation function for Solaris and others...
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include "string.h"
#include "http.h"
#include "ipp.h"
/*
* 'httpSeparate()' - Separate a Universal Resource Identifier into its
* components.
*/
void
httpSeparate(const char *uri, /* I - Universal Resource Identifier */
char *method, /* O - Method [32] (http, https, etc.) */
char *username, /* O - Username [32] */
char *host, /* O - Hostname [32] */
int *port, /* O - Port number to use */
char *resource) /* O - Resource/filename [1024] */
{
char *ptr; /* Pointer into string... */
const char *atsign, /* @ sign */
*slash; /* Separator */
char safeuri[HTTP_MAX_URI]; /* "Safe" local copy of URI */
char quoted; /* Quoted character */
/*
* Range check input...
*/
if (uri == NULL || method == NULL || username == NULL || host == NULL ||
port == NULL || resource == NULL)
return;
/*
* Copy the URL to a local string to make sure we don't have a URL
* longer than HTTP_MAX_URI characters long...
*/
strlcpy(safeuri, uri, sizeof(safeuri));
uri = safeuri;
/*
* Grab the method portion of the URI...
*/
if (strncmp(uri, "//", 2) == 0)
{
/*
* Workaround for HP IPP client bug...
*/
strcpy(method, "ipp");
}
else
{
/*
* Standard URI with method...
*/
for (ptr = host; *uri != ':' && *uri != '\0'; uri ++)
if (ptr < (host + HTTP_MAX_URI - 1))
*ptr++ = *uri;
*ptr = '\0';
if (*uri == ':')
uri ++;
/*
* If the method contains a period or slash, then it's probably
* hostname/filename...
*/
if (strchr(host, '.') != NULL || strchr(host, '/') != NULL || *uri == '\0')
{
if ((ptr = strchr(host, '/')) != NULL)
{
strlcpy(resource, ptr, HTTP_MAX_URI);
*ptr = '\0';
}
else
resource[0] = '\0';
if (isdigit(*uri))
{
/*
* OK, we have "hostname:port[/resource]"...
*/
*port = strtol(uri, (char **)&uri, 10);
if (*uri == '/')
strlcpy(resource, uri, HTTP_MAX_URI);
}
else
*port = 631;
strcpy(method, "http");
username[0] = '\0';
return;
}
else
strlcpy(method, host, 32);
}
/*
* If the method starts with less than 2 slashes then it is a local resource...
*/
if (strncmp(uri, "//", 2) != 0)
{
strlcpy(resource, uri, HTTP_MAX_URI);
username[0] = '\0';
host[0] = '\0';
*port = 0;
return;
}
/*
* Grab the username, if any...
*/
uri += 2;
if ((slash = strchr(uri, '/')) == NULL)
slash = uri + strlen(uri);
if ((atsign = strchr(uri, '@')) != NULL && atsign < slash)
{
/*
* Got a username:password combo...
*/
for (ptr = username; uri < atsign; uri ++)
if (ptr < (username + HTTP_MAX_URI - 1))
{
if (*uri == '%' && isxdigit(uri[1]) && isxdigit(uri[2]))
{
/*
* Grab a hex-encoded username and password...
*/
uri ++;
if (isalpha(*uri))
quoted = (tolower(*uri) - 'a' + 10) << 4;
else
quoted = (*uri - '0') << 4;
uri ++;
if (isalpha(*uri))
quoted |= tolower(*uri) - 'a' + 10;
else
quoted |= *uri - '0';
*ptr++ = quoted;
}
else
*ptr++ = *uri;
}
*ptr = '\0';
uri = atsign + 1;
}
else
username[0] = '\0';
/*
* Grab the hostname...
*/
for (ptr = host; *uri != ':' && *uri != '/' && *uri != '\0'; uri ++)
if (ptr < (host + HTTP_MAX_URI - 1))
*ptr++ = *uri;
*ptr = '\0';
if (*uri != ':')
{
if (strcasecmp(method, "http") == 0)
*port = 80;
else if (strcasecmp(method, "https") == 0)
*port = 443;
else if (strcasecmp(method, "ipp") == 0)
*port = ippPort();
else if (strcasecmp(method, "lpd") == 0)
*port = 515;
else if (strcasecmp(method, "socket") == 0) /* Not registered yet... */
*port = 9100;
else
*port = 0;
}
else
{
/*
* Parse port number...
*/
*port = 0;
uri ++;
while (isdigit(*uri))
{
*port = (*port * 10) + *uri - '0';
uri ++;
}
}
if (*uri == '\0')
{
/*
* Hostname but no port or path...
*/
resource[0] = '/';
resource[1] = '\0';
return;
}
/*
* The remaining portion is the resource string...
*/
strlcpy(resource, uri, HTTP_MAX_URI);
}
/*
* 'httpStatus()' - Return a short string describing a HTTP status code.
*/
const char * /* O - String or NULL */
httpStatus(http_status_t status) /* I - HTTP status code */
{
switch (status)
{
case HTTP_CONTINUE :
return ("Continue");
case HTTP_SWITCHING_PROTOCOLS :
return ("Switching Protocols");
case HTTP_OK :
return ("OK");
case HTTP_CREATED :
return ("Created");
case HTTP_ACCEPTED :
return ("Accepted");
case HTTP_NO_CONTENT :
return ("No Content");
case HTTP_NOT_MODIFIED :
return ("Not Modified");
case HTTP_BAD_REQUEST :
return ("Bad Request");
case HTTP_UNAUTHORIZED :
return ("Unauthorized");
case HTTP_FORBIDDEN :
return ("Forbidden");
case HTTP_NOT_FOUND :
return ("Not Found");
case HTTP_REQUEST_TOO_LARGE :
return ("Request Entity Too Large");
case HTTP_URI_TOO_LONG :
return ("URI Too Long");
case HTTP_UPGRADE_REQUIRED :
return ("Upgrade Required");
case HTTP_NOT_IMPLEMENTED :
return ("Not Implemented");
case HTTP_NOT_SUPPORTED :
return ("Not Supported");
default :
return ("Unknown");
}
}
#ifndef HAVE_HSTRERROR
/*
* 'cups_hstrerror()' - hstrerror() emulation function for Solaris and others...
*/
const char * /* O - Error string */
cups_hstrerror(int error) /* I - Error number */
{
static const char * const errors[] = /* Error strings */
{
"OK",
"Host not found.",
"Try again.",
"Unrecoverable lookup error.",
"No data associated with name."
};
if (error < 0 || error > 4)
return ("Unknown hostname lookup error.");
else
return (errors[error]);
}
#endif /* !HAVE_HSTRERROR */
/*
* End of "$Id$".
*/
+1402 -373
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais