mirror of
https://abf.rosa.ru/djam/cups.git
synced 2025-02-23 13:52:46 +00:00
Automatic import for version 1.4.8
This commit is contained in:
commit
9b122cb3fe
35 changed files with 6086 additions and 0 deletions
4
.abf.yml
Normal file
4
.abf.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
sources:
|
||||
"cups-1.4.8-source.tar.bz2": 9167f556e78e0bc075f1eb2f695d79cc1f334007
|
||||
"pap-backend.tar.bz2": 89e1e7eb4258d47069d2a60c383b8bd555a11e63
|
||||
"pap-docu.pdf.bz2": 7e7d44bb58532ab2fc4c1ca3581787877f1b5733
|
11
cjktexttops
Normal file
11
cjktexttops
Normal file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
INPUT=-
|
||||
if [ $# == 6 ]
|
||||
then
|
||||
INPUT=$6
|
||||
fi
|
||||
|
||||
# Extract the papersize
|
||||
PAPERSIZE=`grep '^\*DefaultPageSize' "$PPD" | cut -d\ -f2`
|
||||
LC_ALL=ja_JP mpage -b$PAPERSIZE -1 -o -f -m18lr36bt -P- "$INPUT"
|
141
cleanppd.pl
Normal file
141
cleanppd.pl
Normal file
|
@ -0,0 +1,141 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
sub treatfile
|
||||
{
|
||||
|
||||
my $deletethis;
|
||||
my $readval;
|
||||
my $manufacturer;
|
||||
my $manuflinefound = 0;
|
||||
my $manufvalid;
|
||||
my $havemanuf;
|
||||
my $model;
|
||||
my $modellinefound;
|
||||
my $modelvalid;
|
||||
my $kap;
|
||||
|
||||
$kap = "";
|
||||
$manufacturer = "";
|
||||
$deletethis = 0;
|
||||
|
||||
print "$_[0] ... ";
|
||||
|
||||
|
||||
#
|
||||
# Read file for the first time to get manufacturer info and to check
|
||||
# whether it should be deleted
|
||||
#
|
||||
|
||||
# open file
|
||||
if (!(open(PPDFILE,"< $_[0]"))) {
|
||||
print STDERR "Can't open PPD file: $_[0]\n";
|
||||
return(0);
|
||||
}
|
||||
# read data
|
||||
$manufvalid = 0;
|
||||
$manuflinefound = 0;
|
||||
while (defined($readval = <PPDFILE>)) {
|
||||
# Remove "Birmy PowerRIP" PPD files (they are for the commercial
|
||||
# Birmy Power RIP software PostScript interpreter (Windows/Mac)
|
||||
if (($readval =~ /birmy/) ||
|
||||
($readval =~ /Birmy/) ||
|
||||
($readval =~ /BIRMY/)) {$deletethis = 1;}
|
||||
# Search for manufacturer tag
|
||||
if ($readval =~ /^\*Manufacturer:\s*"(.*)"\s*$/)
|
||||
{
|
||||
$manufacturer = $1;
|
||||
$manuflinefound = 1;
|
||||
$manufvalid = 1;
|
||||
if (($readval =~ /"Manufacturer"/) || ($readval =~ /"ESP"/))
|
||||
{$manufvalid = 0};
|
||||
}
|
||||
}
|
||||
# close file
|
||||
close(PPDFILE);
|
||||
|
||||
# delete file and stop if a deletion criteria is fulfilled
|
||||
if ($deletethis == 1) {
|
||||
print ("Deleted\n");
|
||||
system("rm -f $_[0]");
|
||||
return(0);
|
||||
}
|
||||
|
||||
$havemanuf = $manufvalid;
|
||||
|
||||
#
|
||||
# Read file for the second time to get model info
|
||||
#
|
||||
|
||||
if (($havemanuf == 0) && ($manufvalid == 0)) {
|
||||
# open file
|
||||
if (!(open(PPDFILE,"< $_[0]"))) {
|
||||
print STDERR "Can't open PPD file: $_[0]\n";
|
||||
return(0);
|
||||
}
|
||||
# read data
|
||||
$modelvalid = 0;
|
||||
while (defined($readval = <PPDFILE>)) {
|
||||
if ($readval =~ /^\*ModelName:\s*"(.*)"\s*$/)
|
||||
{
|
||||
$model=$1;
|
||||
$modelvalid = 1;
|
||||
if (($model eq "Model") || ($readval eq "model")) {$modelvalid = 0};
|
||||
}
|
||||
}
|
||||
# close file
|
||||
close(PPDFILE);
|
||||
|
||||
# Extract manufacturers name
|
||||
if ($modelvalid == 0) { $manufacturer="UNKNOWN MANUFACTURER"
|
||||
} else {
|
||||
@sep = split(/ /,$model);
|
||||
$manufacturer = $sep[0];
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Rewrite file to insert manufacturer info
|
||||
#
|
||||
|
||||
# open file to read
|
||||
if (!(open(PPDFILE,"< $_[0]"))) {
|
||||
print STDERR "Can't open PPD file: $_[0]\n";
|
||||
return(0);
|
||||
}
|
||||
# open file to write
|
||||
if (!(open(NPPDFILE,"> $_[0].new"))) {
|
||||
print STDERR "Can't open new PPD file: $_[0].new\n";
|
||||
return(0);
|
||||
}
|
||||
# read data
|
||||
while (defined($readval = <PPDFILE>)) {
|
||||
if (substr($readval, 0, 14) eq "*Manufacturer:") {
|
||||
$manuflinefound = 1;
|
||||
print NPPDFILE "*Manufacturer: \"$manufacturer\"\n"
|
||||
} else {
|
||||
print NPPDFILE $readval;
|
||||
}
|
||||
if ((substr($readval, 0, 4) ne "*PPD") &&
|
||||
(substr($readval, 0, 2) ne "*%")){
|
||||
if ($manuflinefound == 0) {
|
||||
$manuflinefound = 1;
|
||||
print NPPDFILE "*Manufacturer: \"$manufacturer\"\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
# close files
|
||||
close(PPDFILE);
|
||||
close(NPPDFILE);
|
||||
# move new file onto place of old file
|
||||
system("mv -f $_[0].new $_[0]");
|
||||
# Compress the file
|
||||
system("gzip $_[0]");
|
||||
print("Processed\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
# main program
|
||||
|
||||
{
|
||||
treatfile($ARGV[0]);
|
||||
}
|
107
correctcupsconfig
Normal file
107
correctcupsconfig
Normal file
|
@ -0,0 +1,107 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
#
|
||||
# Till Kamppeter (till@mandrakesoft.com)
|
||||
#
|
||||
# Copyright 2001
|
||||
#
|
||||
# This software may be freely redistributed under the terms of the GNU
|
||||
# General Public License.
|
||||
#
|
||||
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
#
|
||||
|
||||
# Some great piece of code taken from
|
||||
# /usr/lib/perl5/site_perl/5.6.1/MDK/Common/DataStructure.pm
|
||||
# member( $a, @b ) returns 1 if $a is in @b, 0 otherwise.
|
||||
|
||||
sub member { my $e = shift; foreach (@_) { $e eq $_ and return 1 } 0 };
|
||||
|
||||
# Do not do any changes when the user chose manual configuration in
|
||||
# printerdrake
|
||||
|
||||
my $manual = 0;
|
||||
my $manualconffile = "/etc/sysconfig/printing";
|
||||
if (open MANUALCONFFILE, "< $manualconffile") {
|
||||
@manualconf_content = <MANUALCONFFILE>;
|
||||
close MANUALCONFFILE;
|
||||
($_ =~ /^\s*CUPS_CONFIG\s*=\s*manual\s*$/ and $manual = 1) foreach @manualconf_content;
|
||||
}
|
||||
if ($manual) {exit;}
|
||||
|
||||
# Read CUPS config file or create a new one if necessary.
|
||||
|
||||
my $cups_conf = "/etc/cups/cupsd.conf";
|
||||
my @cups_conf_content;
|
||||
my $config_modified = 0;
|
||||
|
||||
if (!(-f $cups_conf)) {
|
||||
warn "No CUPS configuration file $cups_conf, creating one ...\n";
|
||||
@cups_conf_content = split('\n',
|
||||
"LogLevel info
|
||||
TempDir /var/spool/cups/tmp
|
||||
Port 631
|
||||
BrowseAddress \@LOCAL
|
||||
BrowseDeny All
|
||||
BrowseAllow 127.0.0.1
|
||||
BrowseAllow \@LOCAL
|
||||
BrowseOrder deny,allow
|
||||
<Location />
|
||||
Order Deny,Allow
|
||||
Deny From All
|
||||
Allow From 127.0.0.1
|
||||
Allow From \@LOCAL
|
||||
</Location>
|
||||
<Location /admin>
|
||||
AuthType Basic
|
||||
AuthClass System
|
||||
Order Deny,Allow
|
||||
Deny From All
|
||||
Allow From 127.0.0.1
|
||||
</Location>
|
||||
");
|
||||
($_ =~ s/$/\n/) foreach @cups_conf_content;
|
||||
$config_modified = 1;
|
||||
} else {
|
||||
open CONF_CUPS, "$cups_conf" or die "Can't open $cups_conf!";
|
||||
@cups_conf_content = <CONF_CUPS>;
|
||||
close CONF_CUPS;
|
||||
}
|
||||
|
||||
# Check whether LPD/LPRng is installed and turn off creation of an
|
||||
# /etc/printcap file by CUPS.
|
||||
|
||||
if ((-x "/usr/sbin/lpd") &&
|
||||
!(grep { /^\s*Printcap\s*$/ } @cups_conf_content)) {
|
||||
|
||||
my $oldprintcap = "";
|
||||
($_ =~ /^\s*Printcap\s+(\S*)\s*$/ and $oldprintcap = $1)
|
||||
foreach @cups_conf_content;
|
||||
|
||||
if (($oldprintcap eq "") || ($oldprintcap eq "/etc/printcap")) {
|
||||
|
||||
print STDERR "WARNING: Inserted \"Printcap\" line in /etc/cups/cupsd.conf\n (to avoid overwriting the /etc/printcap of the installed LPD/LPRng)\n";
|
||||
|
||||
# Remove all valid "Printcap" lines
|
||||
($_ =~ /^\s*Printcap[^:]/ and $_="") foreach @cups_conf_content;
|
||||
|
||||
# Insert the new "Printcap" line
|
||||
push @cups_conf_content, "Printcap\n";
|
||||
|
||||
# Remove the /etc/printcap file which the CUPS daemon left during
|
||||
# shutdown and replace it by an empty file
|
||||
unlink "/etc/printcap";
|
||||
system "touch /etc/printcap";
|
||||
|
||||
$config_modified = 1;
|
||||
}
|
||||
}
|
||||
|
||||
# Write back the modified CUPS config file
|
||||
if ($config_modified) {
|
||||
open CONF_CUPS, ">$cups_conf" or die "Can't open $cups_conf";
|
||||
print CONF_CUPS @cups_conf_content;
|
||||
close CONF_CUPS;
|
||||
}
|
11
cups-1.3.7-peercred.patch
Normal file
11
cups-1.3.7-peercred.patch
Normal file
|
@ -0,0 +1,11 @@
|
|||
diff -up cups-1.3.5/scheduler/auth.c.peercred cups-1.3.5/scheduler/auth.c
|
||||
--- cups-1.3.5/scheduler/auth.c.peercred 2008-02-05 16:52:20.000000000 +0000
|
||||
+++ cups-1.3.5/scheduler/auth.c 2008-02-05 18:20:06.000000000 +0000
|
||||
@@ -54,6 +54,7 @@
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
+#define _GNU_SOURCE
|
||||
#include "cupsd.h"
|
||||
#include <grp.h>
|
||||
#ifdef HAVE_SHADOW_H
|
21
cups-1.4-permissions.patch
Normal file
21
cups-1.4-permissions.patch
Normal file
|
@ -0,0 +1,21 @@
|
|||
--- cups-1.4svn-r8684/Makedefs.in~ 2009-05-21 19:20:06.000000000 +0200
|
||||
+++ cups-1.4svn-r8684/Makedefs.in 2009-05-26 21:50:03.000000000 +0200
|
||||
@@ -40,13 +40,13 @@
|
||||
# Installation programs...
|
||||
#
|
||||
|
||||
-INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
|
||||
+INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
|
||||
INSTALL_CONFIG = $(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@
|
||||
-INSTALL_DATA = $(INSTALL) -c -m 444
|
||||
+INSTALL_DATA = $(INSTALL) -c -m 644
|
||||
INSTALL_DIR = $(INSTALL) -d
|
||||
-INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@
|
||||
-INSTALL_MAN = $(INSTALL) -c -m 444
|
||||
-INSTALL_SCRIPT = $(INSTALL) -c -m 555
|
||||
+INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 755 @INSTALL_STRIP@
|
||||
+INSTALL_MAN = $(INSTALL) -c -m 644
|
||||
+INSTALL_SCRIPT = $(INSTALL) -c -m 755
|
||||
|
||||
#
|
||||
# Default user, group, and system groups for the scheduler...
|
26
cups-1.4.0-recommended.patch
Normal file
26
cups-1.4.0-recommended.patch
Normal file
|
@ -0,0 +1,26 @@
|
|||
--- cups-1.4svn-r8703/scheduler/cups-driverd.cxx~ 2009-06-09 20:43:47.000000000 +0200
|
||||
+++ cups-1.4svn-r8703/scheduler/cups-driverd.cxx 2009-06-09 21:09:32.000000000 +0200
|
||||
@@ -211,7 +211,6 @@
|
||||
const char *scheme) /* I - PPD scheme */
|
||||
{
|
||||
ppd_info_t *ppd; /* PPD */
|
||||
- char *recommended; /* Foomatic driver string */
|
||||
|
||||
|
||||
/*
|
||||
@@ -250,15 +249,6 @@
|
||||
strlcpy(ppd->record.scheme, scheme, sizeof(ppd->record.scheme));
|
||||
|
||||
/*
|
||||
- * Strip confusing (and often wrong) "recommended" suffix added by
|
||||
- * Foomatic drivers...
|
||||
- */
|
||||
-
|
||||
- if ((recommended = strstr(ppd->record.make_and_model,
|
||||
- " (recommended)")) != NULL)
|
||||
- *recommended = '\0';
|
||||
-
|
||||
- /*
|
||||
* Add the PPD to the PPD arrays...
|
||||
*/
|
||||
|
569
cups-1.4.3-both-usblp-and-libusb.patch
Normal file
569
cups-1.4.3-both-usblp-and-libusb.patch
Normal file
|
@ -0,0 +1,569 @@
|
|||
diff -Naur -x '*~' -x '*.orig' -x '*.rej' cups-1.4.3/backend/ieee1284.c cups-1.4.3-both-usblp-and-libusb/backend/ieee1284.c
|
||||
--- cups-1.4.3/backend/ieee1284.c 2009-12-08 03:13:42.000000000 +0100
|
||||
+++ cups-1.4.3-both-usblp-and-libusb/backend/ieee1284.c 2010-03-31 13:53:53.000000000 +0200
|
||||
@@ -255,6 +255,7 @@
|
||||
cups_option_t *values; /* Keys and values in device ID */
|
||||
const char *mfg, /* Manufacturer */
|
||||
*mdl, /* Model */
|
||||
+ *des, /* Description */
|
||||
*sern; /* Serial number */
|
||||
char temp[256], /* Temporary manufacturer string */
|
||||
*tempptr; /* Pointer into temp string */
|
||||
@@ -285,10 +286,20 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
- strlcpy(temp, make_model, sizeof(temp));
|
||||
+ /*
|
||||
+ * No manufacturer? Use the model string or description...
|
||||
+ */
|
||||
+
|
||||
+ if (mdl)
|
||||
+ _ppdNormalizeMakeAndModel(mdl, temp, sizeof(temp));
|
||||
+ else if ((des = cupsGetOption("DESCRIPTION", num_values, values)) != NULL ||
|
||||
+ (des = cupsGetOption("DES", num_values, values)) != NULL)
|
||||
+ _ppdNormalizeMakeAndModel(des, temp, sizeof(temp));
|
||||
+ else
|
||||
+ strlcpy(temp, "Unknown", sizeof(temp));
|
||||
|
||||
if ((tempptr = strchr(temp, ' ')) != NULL)
|
||||
- *tempptr = '\0';
|
||||
+ *tempptr = '\0';
|
||||
|
||||
mfg = temp;
|
||||
}
|
||||
diff -Naur -x '*~' -x '*.orig' -x '*.rej' cups-1.4.3/backend/Makefile cups-1.4.3-both-usblp-and-libusb/backend/Makefile
|
||||
--- cups-1.4.3/backend/Makefile 2009-03-03 20:39:21.000000000 +0100
|
||||
+++ cups-1.4.3-both-usblp-and-libusb/backend/Makefile 2010-03-31 13:53:53.000000000 +0200
|
||||
@@ -267,7 +267,7 @@
|
||||
echo Linking $@...
|
||||
$(CC) $(LDFLAGS) -o usb usb.o libbackend.a $(LIBUSB) \
|
||||
$(BACKLIBS) $(LIBS)
|
||||
-usb.o: usb.c usb-darwin.c usb-libusb.c usb-unix.c
|
||||
+usb.o: usb.c usb-darwin.c usb-hybrid.c usb-libusb.c usb-unix.c
|
||||
|
||||
|
||||
#
|
||||
diff -Naur -x '*~' -x '*.orig' -x '*.rej' cups-1.4.3/backend/usb.c cups-1.4.3-both-usblp-and-libusb/backend/usb.c
|
||||
--- cups-1.4.3/backend/usb.c 2008-06-24 03:28:36.000000000 +0200
|
||||
+++ cups-1.4.3-both-usblp-and-libusb/backend/usb.c 2010-03-31 13:53:53.000000000 +0200
|
||||
@@ -56,7 +56,7 @@
|
||||
*/
|
||||
|
||||
#ifdef HAVE_USB_H
|
||||
-# include "usb-libusb.c"
|
||||
+# include "usb-hybrid.c"
|
||||
#elif defined(__APPLE__)
|
||||
# include "usb-darwin.c"
|
||||
#elif defined(__linux) || defined(__sun) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
|
||||
diff -Naur -x '*~' -x '*.orig' -x '*.rej' cups-1.4.3/backend/usb-hybrid.c cups-1.4.3-both-usblp-and-libusb/backend/usb-hybrid.c
|
||||
--- cups-1.4.3/backend/usb-hybrid.c 1970-01-01 01:00:00.000000000 +0100
|
||||
+++ cups-1.4.3-both-usblp-and-libusb/backend/usb-hybrid.c 2010-03-31 13:53:53.000000000 +0200
|
||||
@@ -0,0 +1,87 @@
|
||||
+/*
|
||||
+ * "$Id: usb-hybrid.c 8807 2009-08-31 18:45:43Z mike $"
|
||||
+ *
|
||||
+ * USB port backend for the Common UNIX Printing System (CUPS).
|
||||
+ *
|
||||
+ * This file is included from "usb.c" when compiled on Linux.
|
||||
+ *
|
||||
+ * Copyright 2007-2008 by Apple Inc.
|
||||
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
|
||||
+ *
|
||||
+ * These coded instructions, statements, and computer programs are the
|
||||
+ * property of Apple Inc. and are protected by Federal copyright
|
||||
+ * law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
||||
+ * "LICENSE" which should have been included with this file. If this
|
||||
+ * file is missing or damaged, see the license at "http://www.cups.org/".
|
||||
+ *
|
||||
+ * This file is subject to the Apple OS-Developed Software exception.
|
||||
+ *
|
||||
+ * Contents:
|
||||
+ *
|
||||
+ * print_device() - Print a file to a USB device.
|
||||
+ * list_devices() - List all USB devices.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * Include necessary headers.
|
||||
+ */
|
||||
+
|
||||
+#include <sys/select.h>
|
||||
+
|
||||
+/*
|
||||
+ * Include the two USB implementations used under Linux ...
|
||||
+ */
|
||||
+
|
||||
+#include "usb-libusb.c"
|
||||
+#include "usb-unix.c"
|
||||
+
|
||||
+/*
|
||||
+ * 'print_device()' - Print a file to a USB device.
|
||||
+ */
|
||||
+
|
||||
+int /* O - Exit status */
|
||||
+print_device(const char *uri, /* I - Device URI */
|
||||
+ const char *hostname, /* I - Hostname/manufacturer */
|
||||
+ const char *resource, /* I - Resource/modelname */
|
||||
+ char *options, /* I - Device options/serial number */
|
||||
+ int print_fd, /* I - File descriptor to print */
|
||||
+ int copies, /* I - Copies to print */
|
||||
+ int argc, /* I - Number of command-line arguments (6 or 7) */
|
||||
+ char *argv[]) /* I - Command-line arguments */
|
||||
+{
|
||||
+ int result;
|
||||
+ for(;;)
|
||||
+ {
|
||||
+ result = print_device_unix(uri, hostname, resource, options, print_fd,
|
||||
+ copies, argc, argv);
|
||||
+ if (result == -1)
|
||||
+ {
|
||||
+ result = print_device_libusb(uri, hostname, resource, options, print_fd,
|
||||
+ copies, argc, argv);
|
||||
+ if (result == -1)
|
||||
+ sleep(5);
|
||||
+ else
|
||||
+ return(result);
|
||||
+ }
|
||||
+ else
|
||||
+ return(result);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * 'list_devices()' - List all USB devices.
|
||||
+ */
|
||||
+
|
||||
+void
|
||||
+list_devices(void)
|
||||
+{
|
||||
+ /* Try both discovery methods, each device will appear only under one
|
||||
+ of them */
|
||||
+ list_devices_libusb();
|
||||
+ list_devices_unix();
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * End of "$Id: usb-hybrid.c 8807 2009-08-31 18:45:43Z mike $".
|
||||
+ */
|
||||
diff -Naur -x '*~' -x '*.orig' -x '*.rej' cups-1.4.3/backend/usb-libusb.c cups-1.4.3-both-usblp-and-libusb/backend/usb-libusb.c
|
||||
--- cups-1.4.3/backend/usb-libusb.c 2009-09-11 22:03:31.000000000 +0200
|
||||
+++ cups-1.4.3-both-usblp-and-libusb/backend/usb-libusb.c 2010-03-31 13:53:53.000000000 +0200
|
||||
@@ -13,16 +13,16 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
- * list_devices() - List the available printers.
|
||||
- * print_device() - Print a file to a USB device.
|
||||
+ * list_devices_libusb() - List the available printers.
|
||||
+ * print_device_libusb() - Print a file to a USB device.
|
||||
* close_device() - Close the connection to the USB printer.
|
||||
* find_device() - Find or enumerate USB printers.
|
||||
* get_device_id() - Get the IEEE-1284 device ID for the printer.
|
||||
* list_cb() - List USB printers for discovery.
|
||||
* make_device_uri() - Create a device URI for a USB printer.
|
||||
- * open_device() - Open a connection to the USB printer.
|
||||
+ * open_device_libusb() - Open a connection to the USB printer.
|
||||
* print_cb() - Find a USB printer for printing.
|
||||
- * side_cb() - Handle side-channel requests.
|
||||
+ * side_cb_libusb() - Handle side-channel requests.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -65,30 +65,30 @@
|
||||
static char *make_device_uri(usb_printer_t *printer,
|
||||
const char *device_id,
|
||||
char *uri, size_t uri_size);
|
||||
-static int open_device(usb_printer_t *printer, int verbose);
|
||||
+static int open_device_libusb(usb_printer_t *printer, int verbose);
|
||||
static int print_cb(usb_printer_t *printer, const char *device_uri,
|
||||
const char *device_id, const void *data);
|
||||
-static ssize_t side_cb(usb_printer_t *printer, int print_fd);
|
||||
+static ssize_t side_cb_libusb(usb_printer_t *printer, int print_fd);
|
||||
|
||||
|
||||
/*
|
||||
- * 'list_devices()' - List the available printers.
|
||||
+ * 'list_devices_libusb()' - List the available printers.
|
||||
*/
|
||||
|
||||
void
|
||||
-list_devices(void)
|
||||
+list_devices_libusb(void)
|
||||
{
|
||||
- fputs("DEBUG: list_devices\n", stderr);
|
||||
+ fputs("DEBUG: list_devices_libusb\n", stderr);
|
||||
find_device(list_cb, NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
- * 'print_device()' - Print a file to a USB device.
|
||||
+ * 'print_device_libusb()' - Print a file to a USB device.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
-print_device(const char *uri, /* I - Device URI */
|
||||
+print_device_libusb(const char *uri, /* I - Device URI */
|
||||
const char *hostname, /* I - Hostname/manufacturer */
|
||||
const char *resource, /* I - Resource/modelname */
|
||||
char *options, /* I - Device options/serial number */
|
||||
@@ -105,19 +105,23 @@
|
||||
struct pollfd pfds[2]; /* Poll descriptors */
|
||||
|
||||
|
||||
- fputs("DEBUG: print_device\n", stderr);
|
||||
+ fputs("DEBUG: print_device_libusb\n", stderr);
|
||||
|
||||
/*
|
||||
* Connect to the printer...
|
||||
*/
|
||||
|
||||
+#if defined(__linux) || defined(__sun) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__)
|
||||
+ if ((printer = find_device(print_cb, uri)) == NULL)
|
||||
+ return(-1);
|
||||
+#else
|
||||
while ((printer = find_device(print_cb, uri)) == NULL)
|
||||
{
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Waiting for printer to become available...\n"));
|
||||
sleep(5);
|
||||
}
|
||||
-
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* If we are printing data from a print driver on stdin, ignore SIGTERM
|
||||
@@ -189,7 +193,7 @@
|
||||
|
||||
if (pfds[1].revents & (POLLIN | POLLHUP))
|
||||
{
|
||||
- if ((bytes = side_cb(printer, print_fd)) < 0)
|
||||
+ if ((bytes = side_cb_libusb(printer, print_fd)) < 0)
|
||||
pfds[1].events = 0; /* Filter has gone away... */
|
||||
else
|
||||
tbytes += bytes;
|
||||
@@ -359,7 +363,7 @@
|
||||
printer.iface = iface;
|
||||
printer.handle = NULL;
|
||||
|
||||
- if (!open_device(&printer, data != NULL))
|
||||
+ if (!open_device_libusb(&printer, data != NULL))
|
||||
{
|
||||
if (!get_device_id(&printer, device_id, sizeof(device_id)))
|
||||
{
|
||||
@@ -583,6 +587,14 @@
|
||||
mfg = tempmfg;
|
||||
}
|
||||
|
||||
+ if (!strncasecmp(mdl, mfg, strlen(mfg)))
|
||||
+ {
|
||||
+ mdl += strlen(mfg);
|
||||
+
|
||||
+ while (isspace(*mdl & 255))
|
||||
+ mdl ++;
|
||||
+ }
|
||||
+
|
||||
/*
|
||||
* Generate the device URI from the manufacturer, model, serial number,
|
||||
* and interface number...
|
||||
@@ -611,11 +623,11 @@
|
||||
|
||||
|
||||
/*
|
||||
- * 'open_device()' - Open a connection to the USB printer.
|
||||
+ * 'open_device_libusb()' - Open a connection to the USB printer.
|
||||
*/
|
||||
|
||||
static int /* O - 0 on success, -1 on error */
|
||||
-open_device(usb_printer_t *printer, /* I - Printer */
|
||||
+open_device_libusb(usb_printer_t *printer, /* I - Printer */
|
||||
int verbose) /* I - Update connecting-to-device state? */
|
||||
{
|
||||
int number; /* Configuration/interface/altset numbers */
|
||||
@@ -733,16 +745,73 @@
|
||||
const char *device_id, /* I - IEEE-1284 device ID */
|
||||
const void *data) /* I - User data (make, model, S/N) */
|
||||
{
|
||||
- return (!strcmp((char *)data, device_uri));
|
||||
+ char *uri = (char *)data,
|
||||
+ *str1,
|
||||
+ *str2,
|
||||
+ buf[255],
|
||||
+ requested_uri[1024];
|
||||
+
|
||||
+ /* Work on a copy of uri */
|
||||
+ strncpy(requested_uri, uri, sizeof(requested_uri));
|
||||
+ requested_uri[sizeof(requested_uri) - 1] = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * libusb-discovered URIs can have an "interface" specification and this
|
||||
+ * never happens for usblp-discovered URIs, so remove the "interface"
|
||||
+ * specification from the URI which we are checking currently. This way a
|
||||
+ * queue for a usblp-discovered printer can now be accessed via libusb
|
||||
+ */
|
||||
+ if (((str1 = strstr(requested_uri, "interface=")) == NULL) &&
|
||||
+ ((str2 = strstr(device_uri, "interface=")) != NULL))
|
||||
+ {
|
||||
+ *(str2 - 1) = '\0';
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Old URI with "serial=?". Cut this part off and consider this as
|
||||
+ * an URI without serial number
|
||||
+ */
|
||||
+ if ((str1 = strstr(requested_uri, "serial=?")) != NULL)
|
||||
+ *(str1 - 1) = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * Old URI without serial number. Match it also with URIs with serial
|
||||
+ * number
|
||||
+ */
|
||||
+ if (((str1 = strstr(requested_uri, "serial=")) == NULL) &&
|
||||
+ ((str2 = strstr(device_uri, "serial=")) != NULL))
|
||||
+ *(str2 - 1) = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * libusb-discovered URIs can have a "serial" specification when the
|
||||
+ * usblp-discovered URI for the same printer does not have one, as
|
||||
+ * with libusb we can discover serial numbers also with other methods
|
||||
+ * than only via the device ID. Therefore we accept also a
|
||||
+ * usblp-discovered printer without serial number as a match. This we
|
||||
+ * do by removing the serial number from the queue's (libusb-discovered)
|
||||
+ * URI before comparing. Also warn the user because of the incapability
|
||||
+ * of the usblp-based access to distinguish printers by the serial
|
||||
+ * number.
|
||||
+ */
|
||||
+ if (((str1 = strstr(requested_uri, "serial=")) == NULL) &&
|
||||
+ ((str2 = strstr(device_uri, "serial=")) != NULL))
|
||||
+ {
|
||||
+ *(str2 - 1) = '\0';
|
||||
+ if (backendGetMakeModel(device_id, buf, sizeof(buf)) == 0)
|
||||
+ fprintf(stderr, "WARNING: If you have more than one %s printer connected to this machine, please make sure that the \"usblp\" kernel module is always unloaded (and blacklisted) and re-create the queues for these printers. Otherwise CUPS will not be able to distinguish them.\n",
|
||||
+ buf);
|
||||
+ }
|
||||
+
|
||||
+ return (!strcmp(requested_uri, device_uri));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
- * 'side_cb()' - Handle side-channel requests.
|
||||
+ * 'side_cb_libusb()' - Handle side-channel requests.
|
||||
*/
|
||||
|
||||
static ssize_t /* O - Number of bytes written */
|
||||
-side_cb(usb_printer_t *printer, /* I - Printer */
|
||||
+side_cb_libusb(usb_printer_t *printer, /* I - Printer */
|
||||
int print_fd) /* I - File to print */
|
||||
{
|
||||
ssize_t bytes, /* Bytes read/written */
|
||||
diff -Naur -x '*~' -x '*.orig' -x '*.rej' cups-1.4.3/backend/usb-unix.c cups-1.4.3-both-usblp-and-libusb/backend/usb-unix.c
|
||||
--- cups-1.4.3/backend/usb-unix.c 2009-12-08 03:13:42.000000000 +0100
|
||||
+++ cups-1.4.3-both-usblp-and-libusb/backend/usb-unix.c 2010-03-31 13:59:05.000000000 +0200
|
||||
@@ -18,10 +18,10 @@
|
||||
*
|
||||
* Contents:
|
||||
*
|
||||
- * print_device() - Print a file to a USB device.
|
||||
- * list_devices() - List all USB devices.
|
||||
- * open_device() - Open a USB device...
|
||||
- * side_cb() - Handle side-channel requests...
|
||||
+ * print_device_unix() - Print a file to a USB device.
|
||||
+ * list_devices_unix() - List all USB devices.
|
||||
+ * open_device_unix() - Open a USB device...
|
||||
+ * side_cb_unix() - Handle side-channel requests...
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -35,17 +35,17 @@
|
||||
* Local functions...
|
||||
*/
|
||||
|
||||
-static int open_device(const char *uri, int *use_bc);
|
||||
-static int side_cb(int print_fd, int device_fd, int snmp_fd,
|
||||
+static int open_device_unix(const char *uri, int *use_bc);
|
||||
+static int side_cb_unix(int print_fd, int device_fd, int snmp_fd,
|
||||
http_addr_t *addr, int use_bc);
|
||||
|
||||
|
||||
/*
|
||||
- * 'print_device()' - Print a file to a USB device.
|
||||
+ * 'print_device_unix()' - Print a file to a USB device.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
-print_device(const char *uri, /* I - Device URI */
|
||||
+print_device_unix(const char *uri, /* I - Device URI */
|
||||
const char *hostname, /* I - Hostname/manufacturer */
|
||||
const char *resource, /* I - Resource/modelname */
|
||||
char *options, /* I - Device options/serial number */
|
||||
@@ -102,7 +102,7 @@
|
||||
strncasecmp(hostname, "Minolta", 7);
|
||||
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ */
|
||||
|
||||
- if ((device_fd = open_device(uri, &use_bc)) == -1)
|
||||
+ if ((device_fd = open_device_unix(uri, &use_bc)) == -1)
|
||||
{
|
||||
if (getenv("CLASS") != NULL)
|
||||
{
|
||||
@@ -132,6 +132,10 @@
|
||||
_("INFO: Printer busy; will retry in 10 seconds...\n"));
|
||||
sleep(10);
|
||||
}
|
||||
+#ifdef HAVE_USB_H
|
||||
+ else
|
||||
+ return (-1);
|
||||
+#else
|
||||
else if (errno == ENXIO || errno == EIO || errno == ENOENT ||
|
||||
errno == ENODEV)
|
||||
{
|
||||
@@ -147,6 +151,7 @@
|
||||
resource, strerror(errno));
|
||||
return (CUPS_BACKEND_FAILED);
|
||||
}
|
||||
+#endif
|
||||
}
|
||||
}
|
||||
while (device_fd < 0);
|
||||
@@ -190,7 +195,7 @@
|
||||
tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, NULL);
|
||||
|
||||
#else
|
||||
- tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb);
|
||||
+ tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb_unix);
|
||||
#endif /* __sun */
|
||||
|
||||
if (print_fd != 0 && tbytes >= 0)
|
||||
@@ -214,11 +219,11 @@
|
||||
|
||||
|
||||
/*
|
||||
- * 'list_devices()' - List all USB devices.
|
||||
+ * 'list_devices_unix()' - List all USB devices.
|
||||
*/
|
||||
|
||||
void
|
||||
-list_devices(void)
|
||||
+list_devices_unix(void)
|
||||
{
|
||||
#ifdef __linux
|
||||
int i; /* Looping var */
|
||||
@@ -320,11 +325,11 @@
|
||||
|
||||
|
||||
/*
|
||||
- * 'open_device()' - Open a USB device...
|
||||
+ * 'open_device_unix()' - Open a USB device...
|
||||
*/
|
||||
|
||||
static int /* O - File descriptor or -1 on error */
|
||||
-open_device(const char *uri, /* I - Device URI */
|
||||
+open_device_unix(const char *uri, /* I - Device URI */
|
||||
int *use_bc) /* O - Set to 0 for unidirectional */
|
||||
{
|
||||
int fd; /* File descriptor */
|
||||
@@ -357,9 +362,12 @@
|
||||
char device[255], /* Device filename */
|
||||
device_id[1024], /* Device ID string */
|
||||
make_model[1024], /* Make and model */
|
||||
- device_uri[1024]; /* Device URI string */
|
||||
-
|
||||
+ device_uri[1024], /* Device URI string */
|
||||
+ requested_uri[1024], /* Device URI string */
|
||||
+ *str1,
|
||||
+ *str2;
|
||||
|
||||
+
|
||||
/*
|
||||
* Find the correct USB device...
|
||||
*/
|
||||
@@ -407,7 +415,55 @@
|
||||
device_uri[0] = '\0';
|
||||
}
|
||||
|
||||
- if (!strcmp(uri, device_uri))
|
||||
+ /* Work on a copy of uri */
|
||||
+ strncpy(requested_uri, uri, sizeof(requested_uri));
|
||||
+ requested_uri[sizeof(requested_uri) - 1] = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * libusb-discovered URIs can have an "interface" specification and this
|
||||
+ * never happens for usblp-discovered URIs, so remove the "interface"
|
||||
+ * specification from the URI of the print queue. This way a queue for
|
||||
+ * a libusb-discovered printer can now be accessed via the usblip kernel
|
||||
+ * module
|
||||
+ */
|
||||
+ if ((str1 = strstr(requested_uri, "interface=")) != NULL)
|
||||
+ *(str1 - 1) = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * Old URI with "serial=?". Cut this part off and consider this as
|
||||
+ * an URI without serial number
|
||||
+ */
|
||||
+ if ((str1 = strstr(requested_uri, "serial=?")) != NULL)
|
||||
+ *(str1 - 1) = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * Old URI without serial number. Match it also with URIs with serial
|
||||
+ * number
|
||||
+ */
|
||||
+ if (((str1 = strstr(requested_uri, "serial=")) == NULL) &&
|
||||
+ ((str2 = strstr(device_uri, "serial=")) != NULL))
|
||||
+ *(str2 - 1) = '\0';
|
||||
+
|
||||
+ /*
|
||||
+ * libusb-discovered URIs can have a "serial" specification when the
|
||||
+ * usblp-discovered URI for the same printer does not have one, as
|
||||
+ * with libusb we can discover serial numbers also with other methods
|
||||
+ * than only via the device ID. Therefore we accept also a
|
||||
+ * usblp-discovered printer without serial number as a match. This we
|
||||
+ * do by removing the serial number from the queue's (libusb-discovered)
|
||||
+ * URI before comparing. Also warn the user because of the incapability
|
||||
+ * of the usblp-based access to distinguish printers by the serial
|
||||
+ * number.
|
||||
+ */
|
||||
+ if (((str1 = strstr(requested_uri, "serial=")) != NULL) &&
|
||||
+ ((str2 = strstr(device_uri, "serial=")) == NULL))
|
||||
+ {
|
||||
+ *(str1 - 1) = '\0';
|
||||
+ fprintf(stderr, "WARNING: If you have more than one %s printer connected to this machine, please unload (and blacklist) the \"usblp\" kernel module as otherwise CUPS will not be able to distinguish your printers.\n",
|
||||
+ make_model);
|
||||
+ }
|
||||
+
|
||||
+ if (!strcmp(requested_uri, device_uri))
|
||||
{
|
||||
/*
|
||||
* Yes, return this file descriptor...
|
||||
@@ -433,10 +489,14 @@
|
||||
*/
|
||||
|
||||
if (busy)
|
||||
+ {
|
||||
_cupsLangPuts(stderr,
|
||||
_("INFO: Printer busy; will retry in 5 seconds...\n"));
|
||||
|
||||
- sleep(5);
|
||||
+ sleep(5);
|
||||
+ }
|
||||
+ else
|
||||
+ return -1;
|
||||
}
|
||||
}
|
||||
#elif defined(__sun) && defined(ECPPIOC_GETDEVID)
|
||||
@@ -557,11 +617,11 @@
|
||||
|
||||
|
||||
/*
|
||||
- * 'side_cb()' - Handle side-channel requests...
|
||||
+ * 'side_cb_unix()' - Handle side-channel requests...
|
||||
*/
|
||||
|
||||
-static int /* O - 0 on success, -1 on error */
|
||||
-side_cb(int print_fd, /* I - Print file */
|
||||
+static int
|
||||
+side_cb_unix(int print_fd, /* I - Print file */
|
||||
int device_fd, /* I - Device file */
|
||||
int snmp_fd, /* I - SNMP socket (unused) */
|
||||
http_addr_t *addr, /* I - Device address (unused) */
|
43
cups-1.4.4-getpass.patch
Normal file
43
cups-1.4.4-getpass.patch
Normal file
|
@ -0,0 +1,43 @@
|
|||
diff -Naur -x '*.orig' -x '*.rej' -x '*~' cups-1.4.4/cups/usersys.c cups-1.4.4-getpass//cups/usersys.c
|
||||
--- cups-1.4.4/cups/usersys.c 2010-03-31 00:07:33.000000000 +0200
|
||||
+++ cups-1.4.4-getpass//cups/usersys.c 2010-09-09 19:57:49.000000000 +0200
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "globals.h"
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
+#include <termios.h>
|
||||
+#include <signal.h>
|
||||
#ifdef WIN32
|
||||
# include <windows.h>
|
||||
#else
|
||||
@@ -406,7 +408,29 @@
|
||||
* Use the standard getpass function to get a password from the console.
|
||||
*/
|
||||
|
||||
- return (getpass(prompt));
|
||||
+ static char password[100];
|
||||
+ struct termios oldtio, newtio;
|
||||
+ sigset_t oldset, newset;
|
||||
+ int nread;
|
||||
+ sigprocmask (SIG_BLOCK, NULL, &newset);
|
||||
+ sigaddset (&newset, SIGINT);
|
||||
+ sigaddset (&newset, SIGTSTP);
|
||||
+ sigprocmask (SIG_BLOCK, &newset, &oldset);
|
||||
+ tcgetattr (STDIN_FILENO, &oldtio);
|
||||
+ newtio = oldtio;
|
||||
+ newtio.c_lflag &= ~ECHO;
|
||||
+ tcsetattr (STDIN_FILENO, TCSAFLUSH, &newtio);
|
||||
+ fputs (prompt, stdout);
|
||||
+ fflush (stdout);
|
||||
+ nread = read (STDIN_FILENO, password, sizeof (password));
|
||||
+ tcsetattr (STDIN_FILENO, TCSAFLUSH, &oldtio);
|
||||
+ fputc ('\n', stdout);
|
||||
+ sigprocmask (SIG_SETMASK, &oldset, NULL);
|
||||
+ if (nread > 0)
|
||||
+ password[nread - 1] = '\0';
|
||||
+ else
|
||||
+ password[0] ='\0';
|
||||
+ return password;
|
||||
#endif /* WIN32 */
|
||||
}
|
||||
|
33
cups-1.4.4-no-hostname-broadcast.patch
Normal file
33
cups-1.4.4-no-hostname-broadcast.patch
Normal file
|
@ -0,0 +1,33 @@
|
|||
diff -Naurp cups-1.4.8/scheduler/client.c cups-1.4.8.oden/scheduler/client.c
|
||||
--- cups-1.4.8/scheduler/client.c 2011-01-22 01:07:22.000000000 +0100
|
||||
+++ cups-1.4.8.oden/scheduler/client.c 2011-08-23 12:32:14.592896201 +0200
|
||||
@@ -430,7 +430,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)
|
||||
{
|
||||
if (httpAddrLocalhost(&temp))
|
||||
strlcpy(con->servername, "localhost", sizeof(con->servername));
|
||||
- else if (HostNameLookups || RemotePort)
|
||||
+ else if (HostNameLookups)
|
||||
httpAddrLookup(&temp, con->servername, sizeof(con->servername));
|
||||
else
|
||||
httpAddrString(&temp, con->servername, sizeof(con->servername));
|
||||
@@ -443,7 +443,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)
|
||||
{
|
||||
if (httpAddrLocalhost(&temp))
|
||||
strlcpy(con->servername, "localhost", sizeof(con->servername));
|
||||
- else if (HostNameLookups || RemotePort)
|
||||
+ else if (HostNameLookups)
|
||||
httpAddrLookup(&temp, con->servername, sizeof(con->servername));
|
||||
else
|
||||
httpAddrString(&temp, con->servername, sizeof(con->servername));
|
||||
diff -Naurp cups-1.4.8/scheduler/conf.c cups-1.4.8.oden/scheduler/conf.c
|
||||
--- cups-1.4.8/scheduler/conf.c 2011-01-11 08:05:58.000000000 +0100
|
||||
+++ cups-1.4.8.oden/scheduler/conf.c 2011-08-23 12:32:14.593896179 +0200
|
||||
@@ -750,7 +750,7 @@ cupsdReadConfiguration(void)
|
||||
cupsdAddAlias(ServerAlias, temp);
|
||||
cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp);
|
||||
|
||||
- if (HostNameLookups || RemotePort)
|
||||
+ if (HostNameLookups)
|
||||
{
|
||||
struct hostent *host; /* Host entry to get FQDN */
|
||||
|
91
cups-1.4.4-page-label.patch
Normal file
91
cups-1.4.4-page-label.patch
Normal file
|
@ -0,0 +1,91 @@
|
|||
--- filter/pstops.c 2010-11-17 20:58:22.000000000 +0100
|
||||
+++ filter/pstops.c.oden 2011-01-08 13:01:17.450527001 +0100
|
||||
@@ -108,6 +108,7 @@ typedef struct /**** Document informa
|
||||
int num_options; /* Number of document-wide options */
|
||||
cups_option_t *options; /* Document-wide options */
|
||||
int normal_landscape, /* Normal rotation for landscape? */
|
||||
+ orientation, /* Original orientation of the document */
|
||||
saw_eof, /* Saw the %%EOF comment? */
|
||||
slow_collate, /* Collate copies by hand? */
|
||||
slow_duplex, /* Duplex pages slowly? */
|
||||
@@ -2083,7 +2084,7 @@ do_setup(pstops_doc_t *doc, /* I - Docu
|
||||
* of the pages...
|
||||
*/
|
||||
|
||||
- if (Orientation & 1)
|
||||
+ if (doc->orientation & 1)
|
||||
write_label_prolog(doc, doc->page_label, PageBottom,
|
||||
PageWidth - PageLength + PageTop, PageLength);
|
||||
else
|
||||
@@ -2091,7 +2092,30 @@ do_setup(pstops_doc_t *doc, /* I - Docu
|
||||
PageLength);
|
||||
}
|
||||
else
|
||||
- write_label_prolog(doc, doc->page_label, PageBottom, PageTop, PageWidth);
|
||||
+ {
|
||||
+ switch (doc->orientation)
|
||||
+ {
|
||||
+ case 0 :
|
||||
+ write_label_prolog(doc, doc->page_label, PageBottom, PageTop,
|
||||
+ PageWidth);
|
||||
+ break;
|
||||
+
|
||||
+ case 1 :
|
||||
+ write_label_prolog(doc, doc->page_label, PageLeft, PageRight,
|
||||
+ PageLength);
|
||||
+ break;
|
||||
+
|
||||
+ case 2 :
|
||||
+ write_label_prolog(doc, doc->page_label, PageLength - PageTop,
|
||||
+ PageLength - PageBottom, PageWidth);
|
||||
+ break;
|
||||
+
|
||||
+ case 3 :
|
||||
+ write_label_prolog(doc, doc->page_label, PageWidth - PageRight,
|
||||
+ PageWidth - PageLeft, PageLength);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
@@ -2176,7 +2200,7 @@ end_nup(pstops_doc_t *doc, /* I - Docum
|
||||
case 1 :
|
||||
if (doc->use_ESPshowpage)
|
||||
{
|
||||
- write_labels(doc, Orientation);
|
||||
+ write_labels(doc, doc->orientation);
|
||||
doc_puts(doc, "ESPshowpage\n");
|
||||
}
|
||||
break;
|
||||
@@ -2191,7 +2215,7 @@ end_nup(pstops_doc_t *doc, /* I - Docum
|
||||
* Rotate the labels back to portrait...
|
||||
*/
|
||||
|
||||
- write_labels(doc, Orientation - 1);
|
||||
+ write_labels(doc, doc->orientation - 1);
|
||||
}
|
||||
else if (Orientation == 0)
|
||||
{
|
||||
@@ -2217,7 +2241,7 @@ end_nup(pstops_doc_t *doc, /* I - Docum
|
||||
default :
|
||||
if (is_last_page(number) && doc->use_ESPshowpage)
|
||||
{
|
||||
- write_labels(doc, Orientation);
|
||||
+ write_labels(doc, doc->orientation);
|
||||
doc_puts(doc, "ESPshowpage\n");
|
||||
}
|
||||
break;
|
||||
@@ -2421,6 +2445,12 @@ set_pstops_options(
|
||||
doc->new_bounding_box[3] = INT_MIN;
|
||||
|
||||
/*
|
||||
+ * Save original orientation of the document
|
||||
+ */
|
||||
+
|
||||
+ doc->orientation = Orientation;
|
||||
+
|
||||
+ /*
|
||||
* AP_FIRSTPAGE_* and the corresponding non-first-page options.
|
||||
*/
|
||||
|
250
cups-1.4.4-str3461-1.4.reverted.patch
Normal file
250
cups-1.4.4-str3461-1.4.reverted.patch
Normal file
|
@ -0,0 +1,250 @@
|
|||
diff -rup cups-1.4.4/cups/http.c cups-1.4.4-str3461-1.4.patch.reverted/cups/http.c
|
||||
--- cups-1.4.4/cups/http.c 2010-06-16 07:27:41.000000000 +0200
|
||||
+++ cups-1.4.4-str3461-1.4.patch.reverted/cups/http.c 2010-06-25 11:02:31.000000000 +0200
|
||||
@@ -83,12 +83,10 @@
|
||||
* http_debug_hex() - Do a hex dump of a buffer.
|
||||
* http_field() - Return the field index for a field name.
|
||||
* http_read_ssl() - Read from a SSL/TLS connection.
|
||||
- * http_locking_cb() - Lock/unlock a thread's mutex.
|
||||
* http_send() - Send a request with all fields and the trailing
|
||||
* blank line.
|
||||
* http_setup_ssl() - Set up SSL/TLS support on a connection.
|
||||
* http_shutdown_ssl() - Shut down SSL/TLS on a connection.
|
||||
- * http_threadid_cb() - Return the current thread ID.
|
||||
* http_upgrade() - Force upgrade to TLS encryption.
|
||||
* http_write() - Write a buffer to a HTTP connection.
|
||||
* http_write_chunk() - Write a chunked buffer.
|
||||
@@ -146,19 +144,6 @@ static int http_setup_ssl(http_t *http)
|
||||
static void http_shutdown_ssl(http_t *http);
|
||||
static int http_upgrade(http_t *http);
|
||||
static int http_write_ssl(http_t *http, const char *buf, int len);
|
||||
-
|
||||
-# ifdef HAVE_GNUTLS
|
||||
-# ifdef HAVE_PTHREAD_H
|
||||
-GCRY_THREAD_OPTION_PTHREAD_IMPL;
|
||||
-# endif /* HAVE_PTHREAD_H */
|
||||
-
|
||||
-# elif defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
|
||||
-static pthread_mutex_t *http_locks; /* OpenSSL lock mutexes */
|
||||
-
|
||||
-static void http_locking_cb(int mode, int type, const char *file,
|
||||
- int line);
|
||||
-static unsigned long http_threadid_cb(void);
|
||||
-# endif /* HAVE_GNUTLS */
|
||||
#endif /* HAVE_SSL */
|
||||
|
||||
|
||||
@@ -1188,22 +1173,21 @@ httpHead(http_t *http, /* I - Conne
|
||||
void
|
||||
httpInitialize(void)
|
||||
{
|
||||
- static int initialized = 0; /* Have we been called before? */
|
||||
-#ifdef WIN32
|
||||
- WSADATA winsockdata; /* WinSock data */
|
||||
-#endif /* WIN32 */
|
||||
#ifdef HAVE_LIBSSL
|
||||
- int i; /* Looping var */
|
||||
- unsigned char data[1024]; /* Seed data */
|
||||
+# ifndef WIN32
|
||||
+ struct timeval curtime; /* Current time in microseconds */
|
||||
+# endif /* !WIN32 */
|
||||
+ int i; /* Looping var */
|
||||
+ unsigned char data[1024]; /* Seed data */
|
||||
#endif /* HAVE_LIBSSL */
|
||||
|
||||
-
|
||||
- if (initialized)
|
||||
- return;
|
||||
-
|
||||
#ifdef WIN32
|
||||
- WSAStartup(MAKEWORD(2,2), &winsockdata);
|
||||
+ WSADATA winsockdata; /* WinSock data */
|
||||
|
||||
+
|
||||
+ static int initialized = 0; /* Has WinSock been initialized? */
|
||||
+ if (!initialized)
|
||||
+ WSAStartup(MAKEWORD(1,1), &winsockdata);
|
||||
#elif !defined(SO_NOSIGPIPE)
|
||||
/*
|
||||
* Ignore SIGPIPE signals...
|
||||
@@ -1226,56 +1210,29 @@ httpInitialize(void)
|
||||
#endif /* WIN32 */
|
||||
|
||||
#ifdef HAVE_GNUTLS
|
||||
- /*
|
||||
- * Make sure we handle threading properly...
|
||||
- */
|
||||
-
|
||||
-# ifdef HAVE_PTHREAD_H
|
||||
- gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
|
||||
-# endif /* HAVE_PTHREAD_H */
|
||||
-
|
||||
- /*
|
||||
- * Initialize GNU TLS...
|
||||
- */
|
||||
-
|
||||
gnutls_global_init();
|
||||
+#endif /* HAVE_GNUTLS */
|
||||
|
||||
-#elif defined(HAVE_LIBSSL)
|
||||
- /*
|
||||
- * Initialize OpenSSL...
|
||||
- */
|
||||
-
|
||||
+#ifdef HAVE_LIBSSL
|
||||
SSL_load_error_strings();
|
||||
SSL_library_init();
|
||||
|
||||
/*
|
||||
- * Set the threading callbacks...
|
||||
- */
|
||||
-
|
||||
-# ifdef HAVE_PTHREAD_H
|
||||
- http_locks = calloc(CRYPTO_num_locks(), sizeof(pthread_mutex_t));
|
||||
-
|
||||
- for (i = 0; i < CRYPTO_num_locks(); i ++)
|
||||
- pthread_mutex_init(http_locks + i, NULL);
|
||||
-
|
||||
- CRYPTO_set_id_callback(http_threadid_cb);
|
||||
- CRYPTO_set_locking_callback(http_locking_cb);
|
||||
-# endif /* HAVE_PTHREAD_H */
|
||||
-
|
||||
- /*
|
||||
* Using the current time is a dubious random seed, but on some systems
|
||||
* it is the best we can do (on others, this seed isn't even used...)
|
||||
*/
|
||||
|
||||
- CUPS_SRAND(time(NULL));
|
||||
+# ifdef WIN32
|
||||
+# else
|
||||
+ gettimeofday(&curtime, NULL);
|
||||
+ srand(curtime.tv_sec + curtime.tv_usec);
|
||||
+# endif /* WIN32 */
|
||||
|
||||
for (i = 0; i < sizeof(data); i ++)
|
||||
- data[i] = CUPS_RAND();
|
||||
+ data[i] = rand();
|
||||
|
||||
RAND_seed(data, sizeof(data));
|
||||
-#endif /* HAVE_GNUTLS */
|
||||
-
|
||||
- initialized = 1;
|
||||
+#endif /* HAVE_LIBSSL */
|
||||
}
|
||||
|
||||
|
||||
@@ -2834,25 +2791,6 @@ http_read_ssl(http_t *http, /* I - Conn
|
||||
#endif /* HAVE_SSL */
|
||||
|
||||
|
||||
-#if defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
|
||||
-/*
|
||||
- * 'http_locking_cb()' - Lock/unlock a thread's mutex.
|
||||
- */
|
||||
-
|
||||
-static void
|
||||
-http_locking_cb(int mode, /* I - Lock mode */
|
||||
- int type, /* I - Lock type */
|
||||
- const char *file, /* I - Source file */
|
||||
- int line) /* I - Line number */
|
||||
-{
|
||||
- if (mode & CRYPTO_LOCK)
|
||||
- pthread_mutex_lock(http_locks + type);
|
||||
- else
|
||||
- pthread_mutex_unlock(http_locks + type);
|
||||
-}
|
||||
-#endif /* HAVE_LIBSSL && HAVE_PTHREAD_H */
|
||||
-
|
||||
-
|
||||
/*
|
||||
* 'http_send()' - Send a request with all fields and the trailing blank line.
|
||||
*/
|
||||
@@ -3224,19 +3162,6 @@ http_shutdown_ssl(http_t *http) /* I -
|
||||
#endif /* HAVE_SSL */
|
||||
|
||||
|
||||
-#if defined(HAVE_LIBSSL) && defined(HAVE_PTHREAD_H)
|
||||
-/*
|
||||
- * 'http_threadid_cb()' - Return the current thread ID.
|
||||
- */
|
||||
-
|
||||
-static unsigned long /* O - Thread ID */
|
||||
-http_threadid_cb(void)
|
||||
-{
|
||||
- return ((unsigned long)pthread_self());
|
||||
-}
|
||||
-#endif /* HAVE_LIBSSL && HAVE_PTHREAD_H */
|
||||
-
|
||||
-
|
||||
#ifdef HAVE_SSL
|
||||
/*
|
||||
* 'http_upgrade()' - Force upgrade to TLS encryption.
|
||||
diff -rup cups-1.4.4/cups/http-private.h cups-1.4.4-str3461-1.4.patch.reverted/cups/http-private.h
|
||||
--- cups-1.4.4/cups/http-private.h 2010-04-12 06:03:53.000000000 +0200
|
||||
+++ cups-1.4.4-str3461-1.4.patch.reverted/cups/http-private.h 2010-06-25 11:03:34.000000000 +0200
|
||||
@@ -98,7 +98,6 @@ extern BIO_METHOD *_httpBIOMethods(void)
|
||||
* The GNU TLS library is more of a "bare metal" SSL/TLS library...
|
||||
*/
|
||||
# include <gnutls/gnutls.h>
|
||||
-# include <gcrypt.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
diff -rup cups-1.4.4/scheduler/main.c cups-1.4.4-str3461-1.4.patch.reverted/scheduler/main.c
|
||||
--- cups-1.4.4/scheduler/main.c 2010-04-23 20:56:34.000000000 +0200
|
||||
+++ cups-1.4.4-str3461-1.4.patch.reverted/scheduler/main.c 2010-06-25 11:14:07.000000000 +0200
|
||||
@@ -549,8 +549,6 @@ main(int argc, /* I - Number of comm
|
||||
* Startup the server...
|
||||
*/
|
||||
|
||||
- httpInitialize();
|
||||
-
|
||||
cupsdStartServer();
|
||||
|
||||
/*
|
||||
diff -rup cups-1.4.4/scheduler/server.c cups-1.4.4-str3461-1.4.patch.reverted/scheduler/server.c
|
||||
--- cups-1.4.4/scheduler/server.c 2010-04-12 06:03:53.000000000 +0200
|
||||
+++ cups-1.4.4-str3461-1.4.patch.reverted/scheduler/server.c 2010-06-25 11:12:52.000000000 +0200
|
||||
@@ -44,6 +44,42 @@ static int started = 0;
|
||||
void
|
||||
cupsdStartServer(void)
|
||||
{
|
||||
+#ifdef HAVE_LIBSSL
|
||||
+ int i; /* Looping var */
|
||||
+ struct timeval curtime; /* Current time in microseconds */
|
||||
+ unsigned char data[1024]; /* Seed data */
|
||||
+#endif /* HAVE_LIBSSL */
|
||||
+
|
||||
+
|
||||
+#ifdef HAVE_LIBSSL
|
||||
+ /*
|
||||
+ * Initialize the encryption libraries...
|
||||
+ */
|
||||
+
|
||||
+ SSL_library_init();
|
||||
+ SSL_load_error_strings();
|
||||
+
|
||||
+ /*
|
||||
+ * Using the current time is a dubious random seed, but on some systems
|
||||
+ * it is the best we can do (on others, this seed isn't even used...)
|
||||
+ */
|
||||
+
|
||||
+ gettimeofday(&curtime, NULL);
|
||||
+ srand(curtime.tv_sec + curtime.tv_usec);
|
||||
+
|
||||
+ for (i = 0; i < sizeof(data); i ++)
|
||||
+ data[i] = rand(); /* Yes, this is a poor source of random data... */
|
||||
+
|
||||
+ RAND_seed(&data, sizeof(data));
|
||||
+#elif defined(HAVE_GNUTLS)
|
||||
+ /*
|
||||
+ * Initialize the encryption libraries...
|
||||
+ */
|
||||
+
|
||||
+ gnutls_global_init();
|
||||
+#endif /* HAVE_LIBSSL */
|
||||
+
|
||||
+
|
||||
/*
|
||||
* Create the default security profile...
|
||||
*/
|
1098
cups-avahi.patch
Normal file
1098
cups-avahi.patch
Normal file
File diff suppressed because it is too large
Load diff
11
cups-banners.patch
Normal file
11
cups-banners.patch
Normal file
|
@ -0,0 +1,11 @@
|
|||
--- cups-1.2rc2/scheduler/banners.c.banners 2006-04-19 16:12:07.000000000 +0100
|
||||
+++ cups-1.2rc2/scheduler/banners.c 2006-04-19 16:12:42.000000000 +0100
|
||||
@@ -119,6 +119,8 @@
|
||||
if ((ext = strrchr(dent->filename, '.')) != NULL)
|
||||
if (!strcmp(ext, ".bck") ||
|
||||
!strcmp(ext, ".bak") ||
|
||||
+ !strcmp(ext, ".rpmnew") ||
|
||||
+ !strcmp(ext, ".rpmsave") ||
|
||||
!strcmp(ext, ".sav"))
|
||||
continue;
|
||||
|
90
cups-cups-get-classes.patch
Normal file
90
cups-cups-get-classes.patch
Normal file
|
@ -0,0 +1,90 @@
|
|||
diff -up cups-1.4rc1/cups/dest.c.cups-get-classes cups-1.4rc1/cups/dest.c
|
||||
--- cups-1.4rc1/cups/dest.c.cups-get-classes 2009-05-13 22:39:17.000000000 +0100
|
||||
+++ cups-1.4rc1/cups/dest.c 2009-07-28 22:17:40.285709944 +0100
|
||||
@@ -1735,6 +1735,7 @@ cups_get_sdests(http_t *http, /* I
|
||||
char uri[1024]; /* printer-uri value */
|
||||
int num_options; /* Number of options */
|
||||
cups_option_t *options; /* Options */
|
||||
+ int get_classes; /* Whether we need to fetch class */
|
||||
#ifdef __APPLE__
|
||||
char media_default[41]; /* Default paper size */
|
||||
#endif /* __APPLE__ */
|
||||
@@ -1791,6 +1792,8 @@ cups_get_sdests(http_t *http, /* I
|
||||
* printer-uri [for IPP_GET_PRINTER_ATTRIBUTES]
|
||||
*/
|
||||
|
||||
+ get_classes = (op == CUPS_GET_PRINTERS);
|
||||
+
|
||||
request = ippNewRequest(op);
|
||||
|
||||
ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
|
||||
@@ -1848,6 +1851,23 @@ cups_get_sdests(http_t *http, /* I
|
||||
attr->value_tag != IPP_TAG_URI)
|
||||
continue;
|
||||
|
||||
+ if (get_classes &&
|
||||
+
|
||||
+ /* Is this a class? */
|
||||
+ ((attr->value_tag == IPP_TAG_ENUM &&
|
||||
+ !strcmp(attr->name, "printer-type") &&
|
||||
+ (attr->values[0].integer & CUPS_PRINTER_CLASS)) ||
|
||||
+
|
||||
+ /* Or, is this an attribute from CUPS 1.2 or later? */
|
||||
+ !strcmp(attr->name, "auth-info-required") ||
|
||||
+ !strncmp(attr->name, "marker-", 7) ||
|
||||
+ !strcmp(attr->name, "printer-commands") ||
|
||||
+ !strcmp(attr->name, "printer-is-shared")))
|
||||
+ /* We are talking to a recent enough CUPS server that
|
||||
+ * CUPS_GET_PRINTERS returns classes as well.
|
||||
+ */
|
||||
+ get_classes = 0;
|
||||
+
|
||||
if (!strcmp(attr->name, "auth-info-required") ||
|
||||
!strcmp(attr->name, "device-uri") ||
|
||||
!strcmp(attr->name, "marker-change-time") ||
|
||||
@@ -1939,6 +1959,28 @@ cups_get_sdests(http_t *http, /* I
|
||||
continue;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * If we sent a CUPS_GET_CLASSES request, check whether
|
||||
+ * CUPS_GET_PRINTERS already gave us this destination and exit
|
||||
+ * early if so.
|
||||
+ */
|
||||
+
|
||||
+ if (op == CUPS_GET_CLASSES)
|
||||
+ {
|
||||
+ int diff;
|
||||
+ cups_find_dest (printer_name, NULL, num_dests, *dests, 0, &diff);
|
||||
+ if (diff == 0)
|
||||
+ {
|
||||
+ /*
|
||||
+ * Found it. The CUPS server already gave us the classes in
|
||||
+ * its CUPS_GET_PRINTERS response.
|
||||
+ */
|
||||
+
|
||||
+ cupsFreeOptions(num_options, options);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if ((dest = cups_add_dest(printer_name, NULL, &num_dests, dests)) != NULL)
|
||||
{
|
||||
dest->num_options = num_options;
|
||||
@@ -1955,6 +1997,16 @@ cups_get_sdests(http_t *http, /* I
|
||||
}
|
||||
|
||||
/*
|
||||
+ * If this is a CUPS_GET_PRINTERS request but we didn't see any
|
||||
+ * classes we might be talking to an older CUPS server that requires
|
||||
+ * CUPS_GET_CLASSES as well.
|
||||
+ */
|
||||
+
|
||||
+ if (get_classes)
|
||||
+ num_dests = cups_get_sdests (http, CUPS_GET_CLASSES, name,
|
||||
+ num_dests, dests);
|
||||
+
|
||||
+ /*
|
||||
* Return the count...
|
||||
*/
|
||||
|
21
cups-driverd-timeout.patch
Normal file
21
cups-driverd-timeout.patch
Normal file
|
@ -0,0 +1,21 @@
|
|||
diff -up cups-1.3.7/scheduler/ipp.c.driverd-timeout cups-1.3.7/scheduler/ipp.c
|
||||
--- cups-1.3.7/scheduler/ipp.c.driverd-timeout 2008-07-15 13:40:51.000000000 +0100
|
||||
+++ cups-1.3.7/scheduler/ipp.c 2008-07-15 13:40:51.000000000 +0100
|
||||
@@ -4293,7 +4293,7 @@ copy_model(cupsd_client_t *con, /* I -
|
||||
close(temppipe[1]);
|
||||
|
||||
/*
|
||||
- * Wait up to 30 seconds for the PPD file to be copied...
|
||||
+ * Wait up to 70 seconds for the PPD file to be copied...
|
||||
*/
|
||||
|
||||
total = 0;
|
||||
@@ -4315,7 +4315,7 @@ copy_model(cupsd_client_t *con, /* I -
|
||||
FD_SET(temppipe[0], &input);
|
||||
FD_SET(CGIPipes[0], &input);
|
||||
|
||||
- timeout.tv_sec = 30;
|
||||
+ timeout.tv_sec = 70;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
if ((i = select(maxfd, &input, NULL, NULL, &timeout)) < 0)
|
130
cups-eggcups.patch
Normal file
130
cups-eggcups.patch
Normal file
|
@ -0,0 +1,130 @@
|
|||
diff -up cups-1.4b1/backend/ipp.c.eggcups cups-1.4b1/backend/ipp.c
|
||||
--- cups-1.4b1/backend/ipp.c.eggcups 2008-10-15 19:27:45.000000000 +0100
|
||||
+++ cups-1.4b1/backend/ipp.c 2008-11-11 15:43:30.000000000 +0000
|
||||
@@ -51,6 +51,70 @@ static char pstmpname[1024] = ""; /* Tem
|
||||
static char tmpfilename[1024] = ""; /* Temporary spool file name */
|
||||
static int job_cancelled = 0; /* Job cancelled? */
|
||||
|
||||
+#if HAVE_DBUS
|
||||
+#include <dbus/dbus.h>
|
||||
+
|
||||
+static DBusConnection *dbus_connection = NULL;
|
||||
+
|
||||
+static int
|
||||
+init_dbus (void)
|
||||
+{
|
||||
+ DBusConnection *connection;
|
||||
+ DBusError error;
|
||||
+
|
||||
+ if (dbus_connection &&
|
||||
+ !dbus_connection_get_is_connected (dbus_connection)) {
|
||||
+ dbus_connection_unref (dbus_connection);
|
||||
+ dbus_connection = NULL;
|
||||
+ }
|
||||
+
|
||||
+ dbus_error_init (&error);
|
||||
+ connection = dbus_bus_get (getuid () ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &error);
|
||||
+ if (connection == NULL) {
|
||||
+ dbus_error_free (&error);
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ dbus_connection = connection;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+dbus_broadcast_queued_remote (const char *printer_uri,
|
||||
+ ipp_status_t status,
|
||||
+ unsigned int local_job_id,
|
||||
+ unsigned int remote_job_id,
|
||||
+ const char *username,
|
||||
+ const char *printer_name)
|
||||
+{
|
||||
+ DBusMessage *message;
|
||||
+ DBusMessageIter iter;
|
||||
+ const char *errstr;
|
||||
+
|
||||
+ if (!dbus_connection || !dbus_connection_get_is_connected (dbus_connection)) {
|
||||
+ if (init_dbus () || !dbus_connection)
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ errstr = ippErrorString (status);
|
||||
+ message = dbus_message_new_signal ("/com/redhat/PrinterSpooler",
|
||||
+ "com.redhat.PrinterSpooler",
|
||||
+ "JobQueuedRemote");
|
||||
+ dbus_message_iter_init_append (message, &iter);
|
||||
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &printer_uri);
|
||||
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &errstr);
|
||||
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &local_job_id);
|
||||
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_UINT32, &remote_job_id);
|
||||
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &username);
|
||||
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &printer_name);
|
||||
+
|
||||
+ dbus_connection_send (dbus_connection, message, NULL);
|
||||
+ dbus_connection_flush (dbus_connection);
|
||||
+ dbus_message_unref (message);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif /* HAVE_DBUS */
|
||||
|
||||
/*
|
||||
* Local functions...
|
||||
@@ -1058,6 +1122,15 @@ main(int argc, /* I - Number of comm
|
||||
job_id);
|
||||
}
|
||||
|
||||
+#if HAVE_DBUS
|
||||
+ dbus_broadcast_queued_remote (argv[0],
|
||||
+ ipp_status,
|
||||
+ atoi (argv[1]),
|
||||
+ job_id,
|
||||
+ argv[2],
|
||||
+ getenv ("PRINTER"));
|
||||
+#endif /* HAVE_DBUS */
|
||||
+
|
||||
ippDelete(response);
|
||||
|
||||
if (job_cancelled)
|
||||
diff -up cups-1.4b1/backend/Makefile.eggcups cups-1.4b1/backend/Makefile
|
||||
--- cups-1.4b1/backend/Makefile.eggcups 2008-10-06 22:08:27.000000000 +0100
|
||||
+++ cups-1.4b1/backend/Makefile 2008-11-11 15:45:31.000000000 +0000
|
||||
@@ -188,7 +188,7 @@ dnssd: dnssd.o ../cups/$(LIBCUPS) libbac
|
||||
|
||||
ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a
|
||||
echo Linking $@...
|
||||
- $(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS)
|
||||
+ $(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS) $(CUPSDLIBS)
|
||||
$(RM) http
|
||||
$(LN) ipp http
|
||||
|
||||
diff -up cups-1.4b1/scheduler/subscriptions.c.eggcups cups-1.4b1/scheduler/subscriptions.c
|
||||
--- cups-1.4b1/scheduler/subscriptions.c.eggcups 2008-08-01 22:11:55.000000000 +0100
|
||||
+++ cups-1.4b1/scheduler/subscriptions.c 2008-11-11 15:43:30.000000000 +0000
|
||||
@@ -1302,13 +1302,13 @@ cupsd_send_dbus(cupsd_eventmask_t event,
|
||||
what = "PrinterAdded";
|
||||
else if (event & CUPSD_EVENT_PRINTER_DELETED)
|
||||
what = "PrinterRemoved";
|
||||
- else if (event & CUPSD_EVENT_PRINTER_CHANGED)
|
||||
- what = "QueueChanged";
|
||||
else if (event & CUPSD_EVENT_JOB_CREATED)
|
||||
what = "JobQueuedLocal";
|
||||
else if ((event & CUPSD_EVENT_JOB_STATE) && job &&
|
||||
job->state_value == IPP_JOB_PROCESSING)
|
||||
what = "JobStartedLocal";
|
||||
+ else if (event & (CUPSD_EVENT_PRINTER_CHANGED|CUPSD_EVENT_JOB_STATE_CHANGED|CUPSD_EVENT_PRINTER_STATE_CHANGED))
|
||||
+ what = "QueueChanged";
|
||||
else
|
||||
return;
|
||||
|
||||
@@ -1344,7 +1344,7 @@ cupsd_send_dbus(cupsd_eventmask_t event,
|
||||
dbus_message_append_iter_init(message, &iter);
|
||||
if (dest)
|
||||
dbus_message_iter_append_string(&iter, dest->name);
|
||||
- if (job)
|
||||
+ if (job && strcmp (what, "QueueChanged") != 0)
|
||||
{
|
||||
dbus_message_iter_append_uint32(&iter, job->id);
|
||||
dbus_message_iter_append_string(&iter, job->username);
|
63
cups-logrotate.patch
Normal file
63
cups-logrotate.patch
Normal file
|
@ -0,0 +1,63 @@
|
|||
diff -up cups-1.3.5/scheduler/log.c.logrotate cups-1.3.5/scheduler/log.c
|
||||
--- cups-1.3.5/scheduler/log.c.logrotate 2008-02-14 12:21:25.000000000 +0000
|
||||
+++ cups-1.3.5/scheduler/log.c 2008-02-14 12:24:16.000000000 +0000
|
||||
@@ -29,6 +29,9 @@
|
||||
#include "cupsd.h"
|
||||
#include <stdarg.h>
|
||||
#include <syslog.h>
|
||||
+#include <sys/types.h>
|
||||
+#include <sys/stat.h>
|
||||
+#include <unistd.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -467,12 +470,10 @@ check_log_file(cups_file_t **lf, /* IO -
|
||||
return (1);
|
||||
|
||||
/*
|
||||
- * Format the filename as needed...
|
||||
+ * Format the filename...
|
||||
*/
|
||||
|
||||
- if (!*lf ||
|
||||
- (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize &&
|
||||
- MaxLogSize > 0))
|
||||
+ if (strncmp(logname, "/dev/", 5))
|
||||
{
|
||||
/*
|
||||
* Handle format strings...
|
||||
@@ -565,6 +566,34 @@ check_log_file(cups_file_t **lf, /* IO -
|
||||
}
|
||||
|
||||
/*
|
||||
+ * Has someone else (i.e. logrotate) already rotated the log for us?
|
||||
+ */
|
||||
+ else if (strncmp(filename, "/dev/", 5))
|
||||
+ {
|
||||
+ struct stat st;
|
||||
+ if (stat(filename, &st) || st.st_size == 0)
|
||||
+ {
|
||||
+ /* File is either missing or has zero size. */
|
||||
+
|
||||
+ cupsFileClose(*lf);
|
||||
+ if ((*lf = cupsFileOpen(filename, "a")) == NULL)
|
||||
+ {
|
||||
+ syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename,
|
||||
+ strerror(errno));
|
||||
+
|
||||
+ return (0);
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Change ownership and permissions of non-device logs...
|
||||
+ */
|
||||
+
|
||||
+ fchown(cupsFileNumber(*lf), RunUser, Group);
|
||||
+ fchmod(cupsFileNumber(*lf), LogFilePerm);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
* Do we need to rotate the log?
|
||||
*/
|
||||
|
56
cups-lpr-help.patch
Normal file
56
cups-lpr-help.patch
Normal file
|
@ -0,0 +1,56 @@
|
|||
diff -up cups-1.4b1/berkeley/lpr.c.lpr-help cups-1.4b1/berkeley/lpr.c
|
||||
--- cups-1.4b1/berkeley/lpr.c.lpr-help 2008-07-11 23:46:21.000000000 +0100
|
||||
+++ cups-1.4b1/berkeley/lpr.c 2008-11-11 16:20:32.000000000 +0000
|
||||
@@ -30,6 +30,31 @@
|
||||
#include <cups/i18n.h>
|
||||
|
||||
|
||||
+static void
|
||||
+usage (const char *name)
|
||||
+{
|
||||
+ _cupsLangPrintf(stdout,
|
||||
+"Usage: %s [OPTION] [ file(s) ]\n"
|
||||
+"Print files.\n\n"
|
||||
+" -E force encryption\n"
|
||||
+" -H server[:port] specify alternate server\n"
|
||||
+" -C title, -J title, -T title\n"
|
||||
+" set the job name\n\n"
|
||||
+" -P destination/instance print to named printer\n"
|
||||
+" -U username specify alternate username\n"
|
||||
+" -# num-copies set number of copies\n"
|
||||
+" -h disable banner printing\n"
|
||||
+" -l print without filtering\n"
|
||||
+" -m send email on completion\n"
|
||||
+" -o option[=value] set a job option\n"
|
||||
+" -p format text file with header\n"
|
||||
+" -q hold job for printing\n"
|
||||
+" -r delete files after printing\n"
|
||||
+"\nWith no file given, read standard input.\n"
|
||||
+, name);
|
||||
+}
|
||||
+
|
||||
+
|
||||
/*
|
||||
* 'main()' - Parse options and send files for printing.
|
||||
*/
|
||||
@@ -54,7 +79,6 @@ main(int argc, /* I - Number of comm
|
||||
int deletefile; /* Delete file after print? */
|
||||
char buffer[8192]; /* Copy buffer */
|
||||
|
||||
-
|
||||
_cupsSetLocale(argv);
|
||||
|
||||
deletefile = 0;
|
||||
@@ -282,6 +306,12 @@ main(int argc, /* I - Number of comm
|
||||
break;
|
||||
|
||||
default :
|
||||
+ if (!strcmp (argv[i], "--help"))
|
||||
+ {
|
||||
+ usage (argv[0]);
|
||||
+ return (0);
|
||||
+ }
|
||||
+
|
||||
_cupsLangPrintf(stderr,
|
||||
_("%s: Error - unknown option \'%c\'!\n"),
|
||||
argv[0], argv[i][1]);
|
15
cups-multilib.patch
Normal file
15
cups-multilib.patch
Normal file
|
@ -0,0 +1,15 @@
|
|||
--- cups-1.2.3/cups-config.in.multilib 2006-08-03 01:54:38.000000000 +0100
|
||||
+++ cups-1.2.3/cups-config.in 2006-08-30 15:47:35.000000000 +0100
|
||||
@@ -30,8 +30,10 @@
|
||||
exec_prefix=@exec_prefix@
|
||||
bindir=@bindir@
|
||||
includedir=@includedir@
|
||||
-libdir=@libdir@
|
||||
-imagelibdir=@libdir@
|
||||
+# Fetch libdir from gnutls's pkg-config script. This is a bit
|
||||
+# of a cheat, but the cups-devel package requires gnutls-devel anyway.
|
||||
+libdir=`pkg-config --variable=libdir gnutls`
|
||||
+imagelibdir=`pkg-config --variable=libdir gnutls`
|
||||
datarootdir=@datadir@
|
||||
datadir=@datadir@
|
||||
sysconfdir=@sysconfdir@
|
12
cups-no-export-ssllibs.patch
Normal file
12
cups-no-export-ssllibs.patch
Normal file
|
@ -0,0 +1,12 @@
|
|||
diff -up cups-1.4b2-svn8404/config-scripts/cups-ssl.m4.no-export-ssllibs cups-1.4b2-svn8404/config-scripts/cups-ssl.m4
|
||||
--- cups-1.4b2-svn8404/config-scripts/cups-ssl.m4.no-export-ssllibs 2009-02-17 17:45:27.000000000 +0000
|
||||
+++ cups-1.4b2-svn8404/config-scripts/cups-ssl.m4 2009-03-05 11:12:59.000000000 +0000
|
||||
@@ -110,7 +110,7 @@ fi
|
||||
AC_SUBST(SSLFLAGS)
|
||||
AC_SUBST(SSLLIBS)
|
||||
|
||||
-EXPORT_SSLLIBS="$SSLLIBS"
|
||||
+EXPORT_SSLLIBS=""
|
||||
AC_SUBST(EXPORT_SSLLIBS)
|
||||
|
||||
|
18
cups-no-gzip-man.patch
Normal file
18
cups-no-gzip-man.patch
Normal file
|
@ -0,0 +1,18 @@
|
|||
diff -up cups-1.4b2-svn8404/config-scripts/cups-manpages.m4.no-gzip-man cups-1.4b2-svn8404/config-scripts/cups-manpages.m4
|
||||
--- cups-1.4b2-svn8404/config-scripts/cups-manpages.m4.no-gzip-man 2009-01-16 08:58:42.000000000 +0000
|
||||
+++ cups-1.4b2-svn8404/config-scripts/cups-manpages.m4 2009-03-05 11:11:12.000000000 +0000
|
||||
@@ -69,10 +69,10 @@ case "$uname" in
|
||||
;;
|
||||
Linux* | GNU* | Darwin*)
|
||||
# Linux, GNU Hurd, and Mac OS X
|
||||
- MAN1EXT=1.gz
|
||||
- MAN5EXT=5.gz
|
||||
- MAN7EXT=7.gz
|
||||
- MAN8EXT=8.gz
|
||||
+ MAN1EXT=1
|
||||
+ MAN5EXT=5
|
||||
+ MAN7EXT=7
|
||||
+ MAN8EXT=8
|
||||
MAN8DIR=8
|
||||
;;
|
||||
*)
|
36
cups-pid.patch
Normal file
36
cups-pid.patch
Normal file
|
@ -0,0 +1,36 @@
|
|||
--- cups-1.1.21/scheduler/main.c.pid 2004-09-24 11:29:05.073748138 +0100
|
||||
+++ cups-1.1.21/scheduler/main.c 2004-09-24 11:44:35.826446564 +0100
|
||||
@@ -349,6 +349,8 @@
|
||||
* Setup signal handlers for the parent...
|
||||
*/
|
||||
|
||||
+ pid_t pid;
|
||||
+
|
||||
#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
|
||||
sigset(SIGUSR1, parent_handler);
|
||||
sigset(SIGCHLD, parent_handler);
|
||||
@@ -372,7 +374,7 @@
|
||||
signal(SIGHUP, SIG_IGN);
|
||||
#endif /* HAVE_SIGSET */
|
||||
|
||||
- if (fork() > 0)
|
||||
+ if ((pid = fork()) > 0)
|
||||
{
|
||||
/*
|
||||
* OK, wait for the child to startup and send us SIGUSR1 or to crash
|
||||
@@ -384,7 +386,15 @@
|
||||
sleep(1);
|
||||
|
||||
if (parent_signal == SIGUSR1)
|
||||
+ {
|
||||
+ FILE *f = fopen ("/var/run/cupsd.pid", "w");
|
||||
+ if (f)
|
||||
+ {
|
||||
+ fprintf (f, "%d\n", pid);
|
||||
+ fclose (f);
|
||||
+ }
|
||||
return (0);
|
||||
+ }
|
||||
|
||||
if (wait(&i) < 0)
|
||||
{
|
12
cups-res_init.patch
Normal file
12
cups-res_init.patch
Normal file
|
@ -0,0 +1,12 @@
|
|||
diff -up cups-1.4b2-svn8404/cups/http-addrlist.c.res_init cups-1.4b2-svn8404/cups/http-addrlist.c
|
||||
--- cups-1.4b2-svn8404/cups/http-addrlist.c.res_init 2009-03-23 17:41:03.000000000 +0000
|
||||
+++ cups-1.4b2-svn8404/cups/http-addrlist.c 2009-03-23 17:41:26.000000000 +0000
|
||||
@@ -373,7 +373,7 @@ httpAddrGetList(const char *hostname, /*
|
||||
|
||||
freeaddrinfo(results);
|
||||
}
|
||||
- else if (error == EAI_FAIL)
|
||||
+ else if (error == EAI_FAIL || error == EAI_AGAIN)
|
||||
cg->need_res_init = 1;
|
||||
|
||||
#else
|
192
cups-serverbin-compat.patch
Normal file
192
cups-serverbin-compat.patch
Normal file
|
@ -0,0 +1,192 @@
|
|||
diff -up cups-1.4rc1/scheduler/conf.c.serverbin-compat cups-1.4rc1/scheduler/conf.c
|
||||
--- cups-1.4rc1/scheduler/conf.c.serverbin-compat 2009-05-26 16:41:04.000000000 +0100
|
||||
+++ cups-1.4rc1/scheduler/conf.c 2009-06-17 11:03:24.286442640 +0100
|
||||
@@ -490,6 +490,9 @@ cupsdReadConfiguration(void)
|
||||
cupsdClearString(&ServerName);
|
||||
cupsdClearString(&ServerAdmin);
|
||||
cupsdSetString(&ServerBin, CUPS_SERVERBIN);
|
||||
+#ifdef __x86_64__
|
||||
+ cupsdSetString(&ServerBin_compat, "/usr/lib64/cups");
|
||||
+#endif /* __x86_64__ */
|
||||
cupsdSetString(&RequestRoot, CUPS_REQUESTS);
|
||||
cupsdSetString(&CacheDir, CUPS_CACHEDIR);
|
||||
cupsdSetString(&DataDir, CUPS_DATADIR);
|
||||
@@ -1320,7 +1323,12 @@ cupsdReadConfiguration(void)
|
||||
* Read the MIME type and conversion database...
|
||||
*/
|
||||
|
||||
+#ifdef __x86_64__
|
||||
+ snprintf(temp, sizeof(temp), "%s/filter:%s/filter", ServerBin,
|
||||
+ ServerBin_compat);
|
||||
+#else
|
||||
snprintf(temp, sizeof(temp), "%s/filter", ServerBin);
|
||||
+#endif
|
||||
snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir);
|
||||
|
||||
MimeDatabase = mimeLoadTypes(NULL, mimedir);
|
||||
diff -up cups-1.4rc1/scheduler/conf.h.serverbin-compat cups-1.4rc1/scheduler/conf.h
|
||||
--- cups-1.4rc1/scheduler/conf.h.serverbin-compat 2009-05-11 23:46:01.000000000 +0100
|
||||
+++ cups-1.4rc1/scheduler/conf.h 2009-06-17 11:03:24.287442308 +0100
|
||||
@@ -106,6 +106,10 @@ VAR char *ConfigurationFile VALUE(NULL)
|
||||
/* Root directory for scheduler */
|
||||
*ServerBin VALUE(NULL),
|
||||
/* Root directory for binaries */
|
||||
+#ifdef __x86_64__
|
||||
+ *ServerBin_compat VALUE(NULL),
|
||||
+ /* Compat directory for binaries */
|
||||
+#endif /* __x86_64__ */
|
||||
*StateDir VALUE(NULL),
|
||||
/* Root directory for state data */
|
||||
*RequestRoot VALUE(NULL),
|
||||
diff -up cups-1.4rc1/scheduler/env.c.serverbin-compat cups-1.4rc1/scheduler/env.c
|
||||
--- cups-1.4rc1/scheduler/env.c.serverbin-compat 2008-06-18 23:31:26.000000000 +0100
|
||||
+++ cups-1.4rc1/scheduler/env.c 2009-06-17 11:03:24.288442597 +0100
|
||||
@@ -86,8 +86,13 @@ cupsdInitEnv(void)
|
||||
cupsdSetEnv("LD_LIBRARY_PATH", NULL);
|
||||
cupsdSetEnv("LD_PRELOAD", NULL);
|
||||
cupsdSetEnv("NLSPATH", NULL);
|
||||
+#ifdef __x86_64__
|
||||
+ cupsdSetEnvf("PATH", "%s/filter:%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
|
||||
+ ":/bin:/usr/bin", ServerBin, ServerBin_compat);
|
||||
+#else /* ! defined(__x86_64__) */
|
||||
cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR
|
||||
":/bin:/usr/bin", ServerBin);
|
||||
+#endif
|
||||
cupsdSetEnv("SERVER_ADMIN", ServerAdmin);
|
||||
cupsdSetEnv("SHLIB_PATH", NULL);
|
||||
cupsdSetEnv("SOFTWARE", CUPS_MINIMAL);
|
||||
diff -up cups-1.4rc1/scheduler/ipp.c.serverbin-compat cups-1.4rc1/scheduler/ipp.c
|
||||
--- cups-1.4rc1/scheduler/ipp.c.serverbin-compat 2009-05-26 23:01:23.000000000 +0100
|
||||
+++ cups-1.4rc1/scheduler/ipp.c 2009-06-17 11:03:24.295443078 +0100
|
||||
@@ -2539,9 +2539,18 @@ add_printer(cupsd_client_t *con, /* I -
|
||||
* Could not find device in list!
|
||||
*/
|
||||
|
||||
+#ifdef __x86_64__
|
||||
+ snprintf(srcfile, sizeof(srcfile), "%s/backend/%s", ServerBin_compat,
|
||||
+ scheme);
|
||||
+ if (access(srcfile, X_OK))
|
||||
+ {
|
||||
+#endif /* __x86_64__ */
|
||||
send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad device-uri scheme \"%s\"!"),
|
||||
scheme);
|
||||
return;
|
||||
+#ifdef __x86_64__
|
||||
+ }
|
||||
+#endif /* __x86_64__ */
|
||||
}
|
||||
}
|
||||
|
||||
diff -up cups-1.4rc1/scheduler/job.c.serverbin-compat cups-1.4rc1/scheduler/job.c
|
||||
--- cups-1.4rc1/scheduler/job.c.serverbin-compat 2009-05-11 23:46:01.000000000 +0100
|
||||
+++ cups-1.4rc1/scheduler/job.c 2009-06-17 11:03:24.305442437 +0100
|
||||
@@ -972,8 +972,32 @@ cupsdContinueJob(cupsd_job_t *job) /* I
|
||||
i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
|
||||
{
|
||||
if (filter->filter[0] != '/')
|
||||
- snprintf(command, sizeof(command), "%s/filter/%s", ServerBin,
|
||||
- filter->filter);
|
||||
+ {
|
||||
+ snprintf(command, sizeof(command), "%s/filter/%s", ServerBin,
|
||||
+ filter->filter);
|
||||
+#ifdef __x86_64__
|
||||
+ if (access(command, F_OK))
|
||||
+ {
|
||||
+ snprintf(command, sizeof(command), "%s/filter/%s",
|
||||
+ ServerBin_compat, filter->filter);
|
||||
+ if (!access(command, F_OK))
|
||||
+ {
|
||||
+ /* Not in the correct directory, but found it in the compat
|
||||
+ * directory. Issue a warning. */
|
||||
+ cupsdLogMessage(CUPSD_LOG_INFO,
|
||||
+ "Filter '%s' not in %s/filter!",
|
||||
+ filter->filter, ServerBin);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* Not in the compat directory either; make any error
|
||||
+ * messages use the correct directory name then. */
|
||||
+ snprintf(command, sizeof(command), "%s/filter/%s", ServerBin,
|
||||
+ filter->filter);
|
||||
+ }
|
||||
+ }
|
||||
+#endif /* __x86_64__ */
|
||||
+ }
|
||||
else
|
||||
strlcpy(command, filter->filter, sizeof(command));
|
||||
|
||||
@@ -1119,6 +1143,28 @@ cupsdContinueJob(cupsd_job_t *job) /* I
|
||||
cupsdClosePipe(job->print_pipes);
|
||||
cupsdClosePipe(job->back_pipes);
|
||||
cupsdClosePipe(job->side_pipes);
|
||||
+#ifdef __x86_64__
|
||||
+ if (access(command, F_OK))
|
||||
+ {
|
||||
+ snprintf(command, sizeof(command), "%s/backend/%s", ServerBin_compat,
|
||||
+ method);
|
||||
+ if (!access(command, F_OK))
|
||||
+ {
|
||||
+ /* Not in the correct directory, but we found it in the compat
|
||||
+ * directory. Issue a warning. */
|
||||
+ cupsdLogMessage(CUPSD_LOG_INFO,
|
||||
+ "Backend '%s' not in %s/backend!", method,
|
||||
+ ServerBin);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* Not in the compat directory either; make any error
|
||||
+ messages use the correct directory name then. */
|
||||
+ snprintf(command, sizeof(command), "%s/backend/%s", ServerBin,
|
||||
+ method);
|
||||
+ }
|
||||
+ }
|
||||
+#endif /* __x86_64__ */
|
||||
|
||||
close(job->status_pipes[1]);
|
||||
job->status_pipes[1] = -1;
|
||||
diff -up cups-1.4rc1/scheduler/printers.c.serverbin-compat cups-1.4rc1/scheduler/printers.c
|
||||
--- cups-1.4rc1/scheduler/printers.c.serverbin-compat 2009-05-16 22:49:57.000000000 +0100
|
||||
+++ cups-1.4rc1/scheduler/printers.c 2009-06-17 11:08:13.888317742 +0100
|
||||
@@ -1015,9 +1015,19 @@ cupsdLoadAllPrinters(void)
|
||||
* Backend does not exist, stop printer...
|
||||
*/
|
||||
|
||||
+#ifdef __x86_64__
|
||||
+ snprintf(line, sizeof(line), "%s/backend/%s", ServerBin_compat,
|
||||
+ p->device_uri);
|
||||
+ if (access(line, 0))
|
||||
+ {
|
||||
+#endif /* __x86_64__ */
|
||||
+
|
||||
p->state = IPP_PRINTER_STOPPED;
|
||||
snprintf(p->state_message, sizeof(p->state_message),
|
||||
"Backend %s does not exist!", line);
|
||||
+#ifdef __x86_64__
|
||||
+ }
|
||||
+#endif /* __x86_64__ */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3549,6 +3559,12 @@ add_printer_filter(
|
||||
|
||||
if (stat(filename, &fileinfo))
|
||||
{
|
||||
+#ifdef __x86_64__
|
||||
+ snprintf(filename, sizeof(filename), "%s/filter/%s", ServerBin_compat,
|
||||
+ program);
|
||||
+ if (stat(filename, &fileinfo))
|
||||
+ {
|
||||
+#endif /* __x86_64__ */
|
||||
memset(&fileinfo, 0, sizeof(fileinfo));
|
||||
|
||||
snprintf(p->state_message, sizeof(p->state_message),
|
||||
@@ -3557,6 +3573,9 @@ add_printer_filter(
|
||||
cupsdSetPrinterReasons(p, "+cups-missing-filter-warning");
|
||||
|
||||
cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
|
||||
+#ifdef __x86_64__
|
||||
+ }
|
||||
+#endif /* __x86_64__ */
|
||||
}
|
||||
|
||||
/*
|
5
cups.logrotate
Normal file
5
cups.logrotate
Normal file
|
@ -0,0 +1,5 @@
|
|||
/var/log/cups/*_log {
|
||||
missingok
|
||||
notifempty
|
||||
sharedscripts
|
||||
}
|
14
cups.service
Normal file
14
cups.service
Normal file
|
@ -0,0 +1,14 @@
|
|||
[Unit]
|
||||
Description=CUPS printing server daemon
|
||||
After=syslog.target oki4daemon.service
|
||||
Requires=network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
EnvironmentFile=-/etc/sysconfig/cups
|
||||
ExecStartPre=/sbin/portrelease cups
|
||||
ExecStart=/usr/sbin/cupsd
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
200
cups.startup
Normal file
200
cups.startup
Normal file
|
@ -0,0 +1,200 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Init file for the CUPS server daemon
|
||||
#
|
||||
# chkconfig: 2345 15 60
|
||||
# description: The Common UNIX Printing System (CUPS), an \
|
||||
# advanced printer spooling system which \
|
||||
# allows setting of printer options and \
|
||||
# automatic availability of a printer \
|
||||
# configured on one server in the whole \
|
||||
# network. Default printing system of Mandriva \
|
||||
# Linux.
|
||||
#
|
||||
# processname: cupsd
|
||||
# config: /etc/cups/cupsd.conf
|
||||
# config: /etc/cups/client.conf
|
||||
# config: /etc/cups/classes.conf
|
||||
# config: /etc/cups/printers.conf
|
||||
# config: /etc/cups/mime.types
|
||||
# config: /etc/cups/mime.convs
|
||||
# config: /etc/cups/ppds.dat
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: cups
|
||||
# Should-Start: $network
|
||||
# Should-Stop: $network
|
||||
# Default-Start: 2 3 4 5
|
||||
# Short-Description: CUPS printing server daemon
|
||||
# Description: The Common UNIX Printing System (CUPS), an
|
||||
# advanced printer spooling system which
|
||||
# allows setting of printer options and
|
||||
# automatic availability of a printer
|
||||
# configured on one server in the whole
|
||||
# network. Default printing system of Mandriva
|
||||
# Linux.
|
||||
### END INIT INFO
|
||||
|
||||
# source function library
|
||||
. /etc/rc.d/init.d/functions
|
||||
|
||||
# default printing auto admin settings
|
||||
ENABLE_QUEUES_ON_SPOOLER_START=no
|
||||
|
||||
# source printing auto admin configuration
|
||||
if [ -r /etc/sysconfig/printing ]; then
|
||||
. /etc/sysconfig/printing
|
||||
fi
|
||||
|
||||
# Source an auxiliary options file if we have one, and pick up OPTIONS
|
||||
# CUPS can now play nice (use NICELEVEL=<number> in /etc/sysconfig/cups)
|
||||
if [ -r /etc/sysconfig/cups ] ; then
|
||||
. /etc/sysconfig/cups
|
||||
fi
|
||||
|
||||
# Don't use TMPDIR environment variable from init script, as that can
|
||||
# cause cupsd to set TempDir to a user's temporary directory instead
|
||||
# of the default...
|
||||
#
|
||||
|
||||
unset TMPDIR
|
||||
|
||||
RETVAL=0
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
# Turn off the CUPS-LPD mini-daemon when LPD is running
|
||||
if [ -x /etc/rc.d/init.d/lpd ]; then
|
||||
if (export LC_ALL=C; /sbin/service lpd status | /bin/egrep "running" > /dev/null 2>&1); then
|
||||
if (export LC_ALL=C; /sbin/chkconfig --list cups-lpd | /bin/egrep "on$" > /dev/null 2>&1); then
|
||||
echo "Turning off CUPS-LPD mini daemon ..."
|
||||
/sbin/chkconfig --del cups-lpd
|
||||
if [ -x /usr/sbin/xinetd ]; then
|
||||
/sbin/service xinetd condrestart
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# Check whether a parallel printer is configured and if
|
||||
# so, but if the parallel printer kernel module not being
|
||||
# loaded, load the module.
|
||||
if (/bin/egrep "^[^#]*/dev/lp" /etc/cups/printers.conf > /dev/null 2>&1); then
|
||||
if (! (export LC_ALL=C; /sbin/lsmod | /bin/egrep "^lp +" > /dev/null 2>&1) || \
|
||||
! (export LC_ALL=C; /sbin/lsmod | /bin/egrep "^parport_pc +" > /dev/null 2>&1)); then
|
||||
echo "Loading parallel port printer kernel modules ..."
|
||||
modprobe parport_pc > /dev/null 2>&1;
|
||||
RET=$?
|
||||
if [ $RET -eq 0 ]; then
|
||||
modprobe lp > /dev/null 2>&1;
|
||||
RET=$?
|
||||
fi
|
||||
if [ $RET -ne 0 ]; then
|
||||
echo
|
||||
echo "WARNING: Parallel printer kernel modules could not be loaded, your parallel"
|
||||
echo " printer may not work."
|
||||
echo
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# Check whether an OKI winprinter is configured with and if so,
|
||||
# but if the oki4daemon not being running, start the oki4daemon.
|
||||
if (/bin/egrep "^[^#]*/dev/oki4drv" /etc/cups/printers.conf > /dev/null 2>&1); then
|
||||
if ! (/bin/ps auxwww | /bin/grep -v "grep" | /bin/grep "oki4daemon" > /dev/null 2>&1); then
|
||||
echo "Starting oki4daemon ..."
|
||||
chkconfig --add oki4daemon
|
||||
/sbin/service oki4daemon start
|
||||
fi
|
||||
fi
|
||||
|
||||
# Do automatic correction of CUPS configuration to avoid
|
||||
# /etc/printcap from LPD/LPRng being overwritten and also
|
||||
# to avoid printer info with hostname "localhost" being
|
||||
# broadcasted. Can be turned off in printerdrake
|
||||
if [ -x /usr/sbin/correctcupsconfig ]; then
|
||||
/usr/sbin/correctcupsconfig
|
||||
fi
|
||||
echo -n "Starting CUPS printing system: "
|
||||
portrelease cups
|
||||
daemon cupsd
|
||||
RETVAL=$?
|
||||
|
||||
echo
|
||||
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/cups
|
||||
|
||||
# CUPS daemon must be listening for the following steps
|
||||
if (ps auxwww | grep cupsd | grep -v grep > /dev/null 2>&1); then
|
||||
if ! (lpstat -r > /dev/null 2>&1); then
|
||||
echo -en "Waiting for the CUPS daemon getting ready"
|
||||
for ((i=0; i < 30; i ++)); do
|
||||
if (lpstat -r > /dev/null 2>&1); then
|
||||
break;
|
||||
fi;
|
||||
sleep 1;
|
||||
echo -en ".";
|
||||
done;
|
||||
echo ""
|
||||
fi
|
||||
if ! (lpstat -r > /dev/null 2>&1); then
|
||||
echo "WARNING: CUPS daemon still not listening after 30 sec, aborting auto-admin tasks."
|
||||
exit $RETVAL
|
||||
fi;
|
||||
fi
|
||||
|
||||
if [ "$ENABLE_QUEUES_ON_SPOOLER_START" == "yes" ]; then
|
||||
# Re-enable disabled print queues
|
||||
gprintf "Re-enabling disabled print queues:\n"
|
||||
for printer in `lpstat -p | grep disabled | cut -d ' ' -f 2`; do
|
||||
if cat /etc/cups/printers.conf | egrep -q "<(Default|)Printer $printer>"; then
|
||||
#if (( ! `lpstat -p $printer | grep -c Paused` )); then
|
||||
gprintf " Printer: $printer\n";
|
||||
/usr/bin/enable $printer
|
||||
#fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [ $RETVAL = 0 ]; then
|
||||
echo_success
|
||||
echo
|
||||
else
|
||||
echo_failure
|
||||
echo
|
||||
fi
|
||||
;;
|
||||
stop)
|
||||
echo -n "Stopping CUPS printing system: "
|
||||
killproc cupsd
|
||||
RETVAL=$?
|
||||
|
||||
echo
|
||||
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/cups
|
||||
;;
|
||||
restart)
|
||||
$0 stop
|
||||
$0 start
|
||||
RETVAL=$?
|
||||
;;
|
||||
status)
|
||||
status cupsd
|
||||
RETVAL=$?
|
||||
;;
|
||||
condrestart)
|
||||
if [ -f /var/lock/subsys/cups ]; then
|
||||
$0 stop
|
||||
$0 start
|
||||
RETVAL=$?
|
||||
fi
|
||||
;;
|
||||
reload)
|
||||
echo -n "Reinitializing CUPS printing system: "
|
||||
killproc cupsd -HUP
|
||||
RETVAL=$?
|
||||
|
||||
echo
|
||||
;;
|
||||
*)
|
||||
echo "Usage: cups {start|stop|restart|reload|status|condrestart}"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
exit $RETVAL
|
2
cups.sysconfig
Normal file
2
cups.sysconfig
Normal file
|
@ -0,0 +1,2 @@
|
|||
# nice level for cupsd
|
||||
NICELEVEL=0
|
362
lphelp.c
Normal file
362
lphelp.c
Normal file
|
@ -0,0 +1,362 @@
|
|||
/*
|
||||
*
|
||||
* lphelp
|
||||
* ------
|
||||
#
|
||||
# A simple tool for getting information about an installed printer or a
|
||||
# PPD file. Especially the printer-specific options defined in the PPD
|
||||
# file are listed, so that one can make use of them with the "lp", "lpr",
|
||||
# and "lpoptions" commands. The programm can also be used by installation/
|
||||
# configuration scripts to give a "preview" to a PPD file.
|
||||
#
|
||||
# ONLY WORKS WITH CUPS DAEMON RUNNING!
|
||||
# The CUPS library (libcups.so.*) must be installed!
|
||||
#
|
||||
# Compile with: gcc -olphelp -lcups lphelp.c
|
||||
#
|
||||
* Copyright 2000 by Till Kamppeter
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <cups/cups.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* 'main()' - Main entry for test program.
|
||||
*/
|
||||
|
||||
int /* O - Exit status */
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i, j, k, m; /* Looping vars */
|
||||
const char *filename; /* File to load */
|
||||
FILE *ppdfile;
|
||||
|
||||
// Temporary file name (for reading from stdin)
|
||||
char tmpfile[19] = "/tmp/lphelp.XXXXXX";
|
||||
const int blocksize = 1024;
|
||||
char buffer[blocksize];
|
||||
int bytesread;
|
||||
|
||||
// variables for parsing PPD file for usual options (boolean, enumerated)
|
||||
ppd_file_t *ppd; /* PPD file record */
|
||||
ppd_size_t *size; /* Size record */
|
||||
ppd_group_t *group; /* UI group */
|
||||
ppd_option_t *option; /* Standard UI option */
|
||||
ppd_choice_t *choice; /* Standard UI option choice */
|
||||
static char *uis[] = { "BOOLEAN", "PICKONE", "PICKMANY" };
|
||||
static char *sections[] = { "ANY", "DOCUMENT", "EXIT",
|
||||
"JCL", "PAGE", "PROLOG" };
|
||||
|
||||
// variables for parsing CUPS-O-MATIC info for numerical options (float, int)
|
||||
char line[1024], /* buffer for reading PPD file line by
|
||||
line to search numerical options */
|
||||
item[1024], /* item to be defined (left of "=>") */
|
||||
value[1024], /* value for item (right of "=>") */
|
||||
argname[1024], /* name of the current argument */
|
||||
comment[1024]; /* human-readable argument name */
|
||||
const char *line_contents; /* contents of line */
|
||||
const char *scan; /* pointer scanning the line */
|
||||
char *writepointer;
|
||||
double min, max, defvalue; /* Range of numerical
|
||||
CUPS-O-MATIC option */
|
||||
int opttype; /* 0 = other, 1 = int, 2 = float */
|
||||
int openbrackets; /* How many curled brackets are open? */
|
||||
int inquotes; /* are we in quotes now? */
|
||||
int inargspart; /* are we in the arguments part now? */
|
||||
|
||||
/*
|
||||
* Display PPD files for each file listed on the command-line...
|
||||
*/
|
||||
|
||||
if (argc == 1) {
|
||||
fputs("Usage: lphelp <filename1>.ppd [<filename2>.ppd ...]\n lphelp <printername1> [<printername2> ...]\n lphelp -\n", stderr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
for (i = 1; i < argc; i ++) {
|
||||
if ((strstr(argv[i], ".ppd")) || (strstr(argv[i], "-")))
|
||||
filename = argv[i];
|
||||
else
|
||||
filename = cupsGetPPD(argv[i]);
|
||||
if (strcmp(filename,"-") == 0) {
|
||||
if ((ppdfile = fdopen(mkstemp(tmpfile), "w")) == NULL) {
|
||||
fprintf(stderr, "Unable to generate temporary file!\n");
|
||||
}
|
||||
while ((bytesread = fread(buffer, 1, blocksize, stdin)) > 0) {
|
||||
fwrite(buffer, 1, bytesread, ppdfile);
|
||||
}
|
||||
fclose(ppdfile);
|
||||
filename = tmpfile;
|
||||
}
|
||||
if ((ppd = ppdOpenFile(filename)) == NULL) {
|
||||
fprintf(stderr, "Unable to open \'%s\' as a PPD file!\n", filename);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("==============================================================================\n\n");
|
||||
printf("%s\n\n", ppd->modelname);
|
||||
printf("==============================================================================\n\n");
|
||||
printf(" %s printer\n\n", ppd->color_device ? "Colour" : "Black & white");
|
||||
printf(" Printer-specific options\n");
|
||||
printf(" ------------------------\n\n");
|
||||
printf(" Besides the options described in the CUPS software users manual\n");
|
||||
printf(" (http://localhost:631/sum.html) you can use also the following options\n");
|
||||
printf(" when you print on this printer with the \"lp\" or \"lpr\" command (a choice\n");
|
||||
printf(" with the \"default\" mark represents the behaviour of the printer when the\n");
|
||||
printf(" appropriate option is not given on the command line):\n\n");
|
||||
|
||||
for (j = 0, group = ppd->groups; j < ppd->num_groups; j ++, group ++) {
|
||||
for (k = 0, option = group->options; k < group->num_options;
|
||||
k ++, option ++) {
|
||||
if (strcmp(option->keyword, "PageRegion") != 0) {
|
||||
if ((strcmp(uis[option->ui],"BOOLEAN") == 0) ||
|
||||
(strcmp(uis[option->ui],"PICKONE") == 0)) {
|
||||
printf(" %s: -o %s=<choice>\n\n",
|
||||
option->text, option->keyword);
|
||||
printf(" <choice> can be one of the following:\n\n");
|
||||
} else {
|
||||
printf(" %s: -o %s=<choice1>,<choice2>,...\n\n",
|
||||
option->text, option->keyword);
|
||||
printf(" <choice1>, <choice2>, and so on can be out of the following:\n\n");
|
||||
}
|
||||
if (strcmp(option->keyword, "PageSize") == 0) {
|
||||
for (m = option->num_choices, choice = option->choices;
|
||||
m > 0;
|
||||
m --, choice ++) {
|
||||
size = ppdPageSize(ppd, choice->choice);
|
||||
|
||||
if (size == NULL)
|
||||
printf(" %s (%s, size unknown", choice->choice, choice->text);
|
||||
else
|
||||
printf(" %s (%s, size: %.2fx%.2fin", choice->choice,
|
||||
choice->text, size->width / 72.0, size->length / 72.0);
|
||||
if (strcmp(option->defchoice, choice->choice) == 0)
|
||||
puts(", default)");
|
||||
else
|
||||
puts(")");
|
||||
}
|
||||
} else {
|
||||
for (m = option->num_choices, choice = option->choices;
|
||||
m > 0;
|
||||
m --, choice ++) {
|
||||
printf(" %s (%s", choice->choice, choice->text);
|
||||
if (strcmp(option->defchoice, choice->choice) == 0)
|
||||
puts(", default)");
|
||||
else
|
||||
puts(")");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
ppdClose(ppd);
|
||||
|
||||
// Search for numerical options of CUPS-O-MATIC
|
||||
if ((ppdfile = fopen(filename,"r")) == NULL) {
|
||||
fprintf(stderr, "Unable to open \'%s\' as a PPD file!\n", filename);
|
||||
continue;
|
||||
}
|
||||
// Reset all variables
|
||||
opttype = 0;
|
||||
min = 0.0; max = 0.0; defvalue = 0.0;
|
||||
openbrackets = 0;
|
||||
inquotes = 0;
|
||||
writepointer = item;
|
||||
inargspart = 0;
|
||||
// Read the PPD file again, line by line.
|
||||
while (fgets(line,sizeof(line),ppdfile)) {
|
||||
// evaluate only lines with CUPS-O-MATIC info
|
||||
if (line_contents = strstr(line,"*% COMDATA #")) {
|
||||
line_contents += 12; // Go to the text after
|
||||
// "*% COMDATA #"
|
||||
for (scan = line_contents;
|
||||
(*scan != '\n') && (*scan != '\0');
|
||||
scan ++) {
|
||||
switch(*scan) {
|
||||
case '[': // open square bracket
|
||||
case '{': // open curled bracket
|
||||
if (!inquotes) {
|
||||
openbrackets ++;
|
||||
// we are on the left hand side now
|
||||
*writepointer = '\0';
|
||||
writepointer = item;
|
||||
// in which type of block are we now?
|
||||
if ((openbrackets == 2) &&
|
||||
(strncasecmp(item,"args",4) == 0)) {
|
||||
// we are entering the arguments section now
|
||||
inargspart = 1;
|
||||
}
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1)) {
|
||||
// new argument, get its name
|
||||
strcpy(argname,item);
|
||||
}
|
||||
// item already evaluated now
|
||||
item[0] = '\0';
|
||||
} else {*writepointer = *scan; writepointer ++;}
|
||||
break;
|
||||
case ',': // end of logical line
|
||||
case ']': // close square bracket
|
||||
case '}': // close curled bracket
|
||||
if (!inquotes) {
|
||||
// right hand side completed, go to left hand side
|
||||
*writepointer = '\0';
|
||||
writepointer = item;
|
||||
// evaluate logical line
|
||||
if (item[0]) {
|
||||
// Machine-readable argument name
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1) &&
|
||||
(strcasecmp(item,"name") == 0)) {
|
||||
strcpy(argname,value);
|
||||
}
|
||||
// Human-readable argument name
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1) &&
|
||||
(strcasecmp(item,"comment") == 0)) {
|
||||
strcpy(comment,value);
|
||||
}
|
||||
// argument type
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1) &&
|
||||
(strcasecmp(item,"type") == 0)) {
|
||||
if (strcasecmp(value,"int") == 0) opttype = 1;
|
||||
if (strcasecmp(value,"float") == 0) opttype = 2;
|
||||
}
|
||||
// minimum value
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1) &&
|
||||
(strcasecmp(item,"min") == 0)) {
|
||||
min = atof(value);
|
||||
}
|
||||
// maximum value
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1) &&
|
||||
(strcasecmp(item,"max") == 0)) {
|
||||
max = atof(value);
|
||||
}
|
||||
// default value
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1) &&
|
||||
(strcasecmp(item,"default") == 0)) {
|
||||
defvalue = atof(value);
|
||||
}
|
||||
// item already evaluated now
|
||||
item[0] = '\0';
|
||||
}
|
||||
// close bracket
|
||||
if ((*scan == '}') || (*scan == ']')) {
|
||||
// which block did we complete now?
|
||||
if ((openbrackets == 2) &&
|
||||
(inargspart == 1)) {
|
||||
// We are leaving the arguments part now
|
||||
inargspart = 0;
|
||||
}
|
||||
if ((openbrackets == 3) &&
|
||||
(inargspart == 1)) {
|
||||
// The current option is completely parsed
|
||||
// Is the option a valid numerical option?
|
||||
if ((opttype > 0) &&
|
||||
(min != max) &&
|
||||
(argname[0])) {
|
||||
// Correct the default value, if necessary
|
||||
if (min < max) {
|
||||
if (defvalue < min) defvalue = min;
|
||||
if (defvalue > max) defvalue = max;
|
||||
} else {
|
||||
if (defvalue < max) defvalue = max;
|
||||
if (defvalue > min) defvalue = min;
|
||||
}
|
||||
// Show the found argument
|
||||
printf(" %s: -o %s=<value>\n\n",
|
||||
comment, argname);
|
||||
if (opttype == 1) {
|
||||
printf(
|
||||
" <value> must be an integer number in the range %d..%d\n",
|
||||
(int)(min),(int)(max));
|
||||
printf(
|
||||
" The default value is %d\n\n",
|
||||
(int)(defvalue));
|
||||
} else {
|
||||
printf(
|
||||
" <value> must be a decimal number in the range %.2f..%.2f\n",
|
||||
min,max);
|
||||
printf(
|
||||
" The default value is %.2f\n\n",
|
||||
defvalue);
|
||||
}
|
||||
}
|
||||
// reset the values
|
||||
argname[0] = '\0';
|
||||
opttype = 0;
|
||||
min = 0.0; max = 0.0; defvalue = 0.0;
|
||||
}
|
||||
openbrackets --;
|
||||
}
|
||||
} else {*writepointer = *scan; writepointer ++;}
|
||||
break;
|
||||
case '\'': // quote
|
||||
if (!inquotes) { // open quote pair
|
||||
inquotes = 1;
|
||||
} else { // close quote pair
|
||||
inquotes = 0;
|
||||
}
|
||||
break;
|
||||
case '=': // "=>"
|
||||
if ((!inquotes) && (*(scan + 1) == '>')) {
|
||||
scan ++;
|
||||
// left hand side completed, go to right hand side
|
||||
*writepointer = '\0';
|
||||
writepointer = value;
|
||||
} else {*writepointer = *scan; writepointer ++;}
|
||||
break;
|
||||
case ' ': // white space
|
||||
case '\t':
|
||||
if (!inquotes) {
|
||||
// ignore white space outside quotes
|
||||
} else {*writepointer = *scan; writepointer ++;}
|
||||
break;
|
||||
default:
|
||||
// write all other characters
|
||||
*writepointer = *scan; writepointer ++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
inquotes = 0; // quote pairs cannot enclose more
|
||||
// than one line
|
||||
}
|
||||
}
|
||||
fclose(ppdfile);
|
||||
printf("\n\n\n");
|
||||
}
|
||||
|
||||
if (!(strstr(tmpfile, "XXXXXX"))) {
|
||||
unlink(tmpfile);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
125
nprint.2002011801
Normal file
125
nprint.2002011801
Normal file
|
@ -0,0 +1,125 @@
|
|||
#!/bin/bash
|
||||
|
||||
VERSION=2002011801
|
||||
|
||||
### NPRINT CUPS backend
|
||||
### Copyright (C) 2001 Mark J. Horn <mark at hornclan dot com>
|
||||
###
|
||||
### 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.
|
||||
###
|
||||
### A copy of the GNU General Public License is available at:
|
||||
### http://www.gnu.org/licenses/gpl.txt
|
||||
|
||||
### INSTALLATION
|
||||
### ------------
|
||||
### To use this script, copy it into your CUPS backends directory, which
|
||||
### might be in /usr/lib/cups/backends or /usr/local/lib/cups/backends.
|
||||
### Make sure that the script is executable by whatever id cupsd runs
|
||||
### with, and then restart CUPS.
|
||||
###
|
||||
### In order for CUPS to detect your novell printers at boot time you
|
||||
### will have to have correctly configured ipx in your kernel, and CUPS
|
||||
### must start *after* your network interface card is up.
|
||||
###
|
||||
### As root, you must be able run "pqlist" and get a list of the
|
||||
### printers on your server. The "pqlist" program uses ~root/.nwclient
|
||||
### as a mechinism for determining the default novell server to use.
|
||||
### This file must be properly configured in order for this backend to
|
||||
### detect and use novell printers. Currently this script will only
|
||||
### enable printing to print queue's on a single server. If anyone
|
||||
### has any ideas on how to support more than one server, please let
|
||||
### me know.
|
||||
###
|
||||
### You should then be able to configure printers in CUPS with the
|
||||
### devices you've configured. I have only been able to configure
|
||||
### devices with the CUPS web interface.
|
||||
###
|
||||
### This single script can be used to support multiple devices. However,
|
||||
### at this point it can only support access to one print server.
|
||||
### This is due to the inability of pqlist to enumerate more than a
|
||||
### single server's printers at a time. If anyone has any ideas on how
|
||||
### I might make printing to multiple servers function, I'd be glad to
|
||||
### hear them.
|
||||
###
|
||||
### DEPENDANCIES
|
||||
### ------------
|
||||
### This script is dependant upon builtin commands in bash. It has not
|
||||
### been tested against other non-bash shells. I don't expect that
|
||||
### it will work with them. You are invited to test other shells.
|
||||
### Please let me know if you have any success.
|
||||
###
|
||||
### This script depends on correctly installed ncpfs software
|
||||
### available at: ftp://platan.vc.cvut.cz/pub/linux/ncpfs/
|
||||
###
|
||||
### This script depends on the following programs being in the PATH
|
||||
### pqlist, nprint, basename, cat
|
||||
### If these commands are not in /bin, /usr/bin, or /usr/local/bin on
|
||||
### your computer, set PATH below to include where they are located.
|
||||
|
||||
PATH=$PATH:/bin:/usr/bin:/usr/local/bin
|
||||
|
||||
### Set root's home directory here:
|
||||
#HOME=/root
|
||||
HOME=~root
|
||||
export HOME
|
||||
|
||||
### Uncomment for crude debugging output
|
||||
#DEBUG=true
|
||||
|
||||
if [ ! -z "$DEBUG" ]; then
|
||||
echo "Args: $0 $*" > /tmp/printargs
|
||||
echo "Arg1: $1" >> /tmp/printargs
|
||||
echo "Arg2: $2" >> /tmp/printargs
|
||||
echo "Arg2: $3" >> /tmp/printargs
|
||||
echo "Arg2: $4" >> /tmp/printargs
|
||||
echo "Arg2: $5" >> /tmp/printargs
|
||||
echo "Arg2: $6" >> /tmp/printargs
|
||||
echo "Arg2: $7" >> /tmp/printargs
|
||||
command -V pqlist >> /tmp/printargs 2>&1
|
||||
command -V nprint >> /tmp/printargs 2>&1
|
||||
command -V basename >> /tmp/printargs 2>&1
|
||||
command -V cat >> /tmp/printargs 2>&1
|
||||
declare -p >> /tmp/printargs
|
||||
echo "pqlist\n------" >> /tmp/printargs
|
||||
pqlist >> /tmp/printargs
|
||||
fi
|
||||
|
||||
ME=`basename $0`
|
||||
|
||||
if [ -z "$*" ]; then
|
||||
|
||||
pqlist | while read printq qid; do
|
||||
echo network $ME:/$printq \"$printq\" \"NPRINT $printq\"
|
||||
done
|
||||
|
||||
exit 0
|
||||
fi
|
||||
|
||||
### For raw printing, $6 is the file to print. For driver processed
|
||||
### printing, $6 is empty and the data to print is in stdin.
|
||||
FILE=$6
|
||||
|
||||
### When advertising multiple printers, the script has to be able
|
||||
### determine where it should send real print jobs. This is done
|
||||
### through the environment variable $DEVICE_URI
|
||||
SENDTO=${DEVICE_URI#${ME}:/}
|
||||
|
||||
if [ ! -z "$DEBUG" ]; then
|
||||
echo "SENDTO: $SENDTO" >> /tmp/printargs
|
||||
cat $6 > /tmp/printout
|
||||
cat /tmp/printout | nprint -q $SENDTO -
|
||||
else
|
||||
cat $FILE | nprint -q $SENDTO -
|
||||
fi
|
79
pdfdistiller
Normal file
79
pdfdistiller
Normal file
|
@ -0,0 +1,79 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# This script is intended to be used as a CUPS backend, to create
|
||||
# PDF file on-the-fly. Just create a printer using the device uri
|
||||
# pdf:/path/to/dir/. When printing to this printer, a PDF file
|
||||
# will be generated in the directory specified. The file name will
|
||||
# be either "<jobname>.pdf" or "unknown.pdf", depending wether the
|
||||
# jobname is empty or not.
|
||||
#
|
||||
# To use it, simply copy this script to your backend directory, and
|
||||
# create a printer with the correct URI. That's it.
|
||||
#
|
||||
# Copyright (C) Michael Goffioul (goffioul@imec.be) 2001
|
||||
LOGFILE=/dev/null
|
||||
PDFBIN=`which ps2pdf`
|
||||
FILENAME=
|
||||
# this is borrowed from printpdf script for the filename
|
||||
PRINTTIME=`date +%b%d-%H%M%S`
|
||||
|
||||
echo "Executable: $PDFBIN" > $LOGFILE
|
||||
echo "Arguments: |$1|$2|$3|$4|$5|$6|" >> $LOGFILE
|
||||
echo $# $PRINTTIME >> $LOGFILE
|
||||
|
||||
# case of no argument, prints available URIs
|
||||
if [ $# -eq 0 ]; then
|
||||
if [ ! -x "$PDFBIN" ]; then
|
||||
exit 0
|
||||
fi
|
||||
echo "direct pdf \"Unknown\" \"PDF Writing\""
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# case of wrong number of arguments
|
||||
if [ $# -ne 5 -a $# -ne 6 ]; then
|
||||
echo "Usage: pdf job-id user title copies options [file]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# get PDF directory from device URI, and check write status
|
||||
PDFDIR=${DEVICE_URI#pdf:}
|
||||
if [ ! -d "$PDFDIR" -o ! -w "$PDFDIR" ]; then
|
||||
echo "ERROR: directory $PDFDIR not writable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "PDF directory: $PDFDIR" >> $LOGFILE
|
||||
|
||||
# generate output filename
|
||||
OUTPUTFILENAME=
|
||||
if [ "$3" = "" ]; then
|
||||
OUTPUTFILENAME="$PDFDIR/unknown.pdf"
|
||||
else
|
||||
# OUTPUTFILENAME="$PDFDIR/${3//[^[:alnum:]]/_}.pdf"
|
||||
# I changed this to user name, and the printtime to track down who
|
||||
# printed the PDF and when, samba printing just uses nobody
|
||||
|
||||
OUTPUTFILENAME="$PDFDIR/$2-$PRINTTIME.pdf"
|
||||
echo "PDF file: $OUTPUTFILENAME placed in: $PDFDIR" >> $LOGFILE
|
||||
fi
|
||||
|
||||
echo "Output file name: $OUTPUTFILENAME" >> $LOGFILE
|
||||
|
||||
# run ghostscript
|
||||
if [ $# -eq 6 ]; then
|
||||
$PDFBIN $6 "$OUTPUTFILENAME"
|
||||
#>& /dev/null
|
||||
else
|
||||
$PDFBIN - "$OUTPUTFILENAME" >& /dev/null
|
||||
fi
|
||||
|
||||
# modify ownership and permissions on the file
|
||||
# - world readable
|
||||
# - owns to user specified in argument
|
||||
chmod a+r "$OUTPUTFILENAME"
|
||||
if [ "$2" != "" ]; then
|
||||
chown $2 "$OUTPUTFILENAME"
|
||||
fi
|
||||
|
||||
exit 0
|
136
photo_print
Normal file
136
photo_print
Normal file
|
@ -0,0 +1,136 @@
|
|||
#!/bin/bash
|
||||
#set -x
|
||||
#
|
||||
# Photo Print
|
||||
# -----------
|
||||
#
|
||||
# Till Kamppeter (http://www.linuxprinting.org/till/)
|
||||
#
|
||||
# Derived from a script from Max Barel (max dot barel at wanadoo dot fr)
|
||||
#
|
||||
# License: GPL (www.gnu.org)
|
||||
#
|
||||
#
|
||||
# Script for printing several photos/image files on on sheet of paper.
|
||||
#
|
||||
# For example for printing 4 postcard-sized photos on one A4/Letter sheet
|
||||
# (1 A4/Letter sheet of photo paper is much cheaper than 4 postcard-sized
|
||||
# sheets, and 1 A4/Letter image is printed faster than 4 postcards).
|
||||
#
|
||||
# Reqirements:
|
||||
#
|
||||
# CUPS printing system (www.cups.org)
|
||||
# ImageMagick (www.imagemagick.org)
|
||||
#
|
||||
# Installation:
|
||||
#
|
||||
# Copy this file into the /usr/bin or /usr/local/bin directory and make it
|
||||
# executable with the command "chmod a+rx photo_print".
|
||||
#
|
||||
# This script mounts photos together to one big image using the "montage"
|
||||
# command of ImageMagick without scaling the images to avoid quality loss.
|
||||
# It sends the resulting image to the printer and lets the image file filter
|
||||
# of CUPS scale the image to fit into the page. By default, 4 images are
|
||||
# printed on one sheet, but the number can be changed with the "-t" option.
|
||||
# On the command line can be given any number of photos, if necessary more
|
||||
# than one page is printed. So one can easily print all the photos from one
|
||||
# directory with one command line:
|
||||
#
|
||||
# photo_print -P Epson1290 *.jpg
|
||||
#
|
||||
#
|
||||
#
|
||||
# Command line parameters and their defaults:
|
||||
#
|
||||
# "-t XxY": Matrix size (Number of columns x number of rows)
|
||||
tile=2x2
|
||||
#
|
||||
# "-s n": Scaling (100 % fills the sheet exactly)
|
||||
# If parts of the edges of the images get lost due to unprintable borders,
|
||||
# use a scaling value lower than 100 to shrink the image to fit the printable
|
||||
# area. With an HP DeskJet 990C you get the best result with a value of 95 when
|
||||
# using A4 paper and 90 when using Letter paper assuming the width/height ratio
|
||||
# of the images being 4:3.
|
||||
scaling=100
|
||||
#
|
||||
# "-p": Preview: when this option is given, from every page a preview is shown
|
||||
# and the user is asked on the console whether he wants to print the page.
|
||||
preview=0
|
||||
#
|
||||
# "-P xxx": Printer on which the photos should be printed (leave blank to use
|
||||
# the default printer)
|
||||
printer=""
|
||||
#
|
||||
# "-o option=value": Driver options ("-o option=value") to give on the command
|
||||
# line of the "lpr" command of CUPS
|
||||
options=""
|
||||
#
|
||||
|
||||
#Get parameters from above from the command line
|
||||
moreoptions=1;
|
||||
while [ $moreoptions == 1 ]
|
||||
do
|
||||
case $1 in
|
||||
-t)
|
||||
shift
|
||||
tile=$1
|
||||
shift
|
||||
;;
|
||||
-s)
|
||||
shift
|
||||
scaling=$1
|
||||
shift
|
||||
;;
|
||||
-p)
|
||||
shift
|
||||
preview=1
|
||||
;;
|
||||
-o)
|
||||
shift
|
||||
options="$options -o $1"
|
||||
shift
|
||||
;;
|
||||
-P)
|
||||
shift
|
||||
printer="-P $1"
|
||||
shift
|
||||
;;
|
||||
-h)
|
||||
echo "Usage: $0 -P printer -s Scaling -t COLUMNSxROWS -o option=value ... file1 file2 ..."
|
||||
exit 0
|
||||
;;
|
||||
* )
|
||||
moreoptions=0;
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
l=$(echo $tile |cut -f1 -dx);
|
||||
L=$(echo $tile |cut -f2 -dx);
|
||||
nbfich=$[ $l * $L ]
|
||||
freespaces=0
|
||||
|
||||
page=1
|
||||
|
||||
while [ "$#" -gt 0 ]
|
||||
do
|
||||
if [ "$nbfich" -gt "$#" ]; then
|
||||
freespaces=$[ $nbfich - $# ]
|
||||
nbfich="$#"
|
||||
fi
|
||||
images=$( echo $* | cut -f1-$nbfich -d " " )
|
||||
shift $nbfich
|
||||
while [ "$freespaces" -gt 0 ]; do
|
||||
images="$images NULL:"
|
||||
freespaces=$[ $freespaces - 1 ]
|
||||
done
|
||||
( [ $preview == 0 ] ||
|
||||
(montage -geometry "128x96+2+2" -tile $tile $images miff:-\
|
||||
| display -title "Page $page" &
|
||||
echo -n "Print this page? "; read in; killall display; [ x$in == xy ] ) ) &&\
|
||||
montage -cache 10 -geometry "100%+2+2" -tile $tile $images pro$page.bmp &&\
|
||||
lpr $printer -o scaling=$scaling $options pro$page.bmp -r
|
||||
page=$[page + 1]
|
||||
done
|
||||
wait
|
||||
rm -f pro[0-9]*.bmp
|
253
poll_ppd_base.c
Normal file
253
poll_ppd_base.c
Normal file
|
@ -0,0 +1,253 @@
|
|||
/*
|
||||
*
|
||||
* poll_ppd_base
|
||||
* -------------
|
||||
#
|
||||
# A simple tool for getting a list of all installed PPD files
|
||||
# with printer manufacturer and printer model, polling the database
|
||||
# of the CUPS daemon. This program is mainly intended to be called
|
||||
# from installation/configuration scripts for CUPS.
|
||||
#
|
||||
# ONLY WORKS WITH CUPS DAEMON RUNNING!
|
||||
# The CUPS library (libcups.so.*) must be installed!
|
||||
#
|
||||
# Compile with: gcc -opoll_ppd_base -lcups poll_ppd_base.c
|
||||
#
|
||||
* Copyright 2000 by Till Kamppeter
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include necessary headers...
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <cups/cups.h>
|
||||
#include <cups/ipp.h>
|
||||
#include <cups/language.h>
|
||||
|
||||
// IPP Request routines for getting the printer type, stolen from QTCUPS from
|
||||
// Michael Goffioul (file qtcups/cupshelper.cpp)
|
||||
|
||||
ipp_t* newIppRequest()
|
||||
{
|
||||
ipp_t *request;
|
||||
cups_lang_t *lang;
|
||||
request = ippNew();
|
||||
request->request.op.request_id = 1;
|
||||
lang = cupsLangDefault();
|
||||
ippAddString(request,IPP_TAG_OPERATION,IPP_TAG_CHARSET,"attributes-charset",NULL,cupsLangEncoding(lang));
|
||||
ippAddString(request,IPP_TAG_OPERATION,IPP_TAG_LANGUAGE,"attributes-natural-language",NULL,lang->language);
|
||||
return request;
|
||||
}
|
||||
|
||||
ipp_t* processRequest(ipp_t *req, const char *res)
|
||||
{
|
||||
http_t *HTTP;
|
||||
ipp_t *answer;
|
||||
HTTP = httpConnect(cupsServer(),ippPort());
|
||||
if (!HTTP) {
|
||||
ippDelete(req);
|
||||
return 0;
|
||||
}
|
||||
answer = cupsDoRequest(HTTP,req,res);
|
||||
httpClose(HTTP);
|
||||
if (!answer) return 0;
|
||||
if (answer->state == IPP_ERROR || answer->state == IPP_IDLE) {
|
||||
ippDelete(answer);
|
||||
return 0;
|
||||
}
|
||||
return answer;
|
||||
}
|
||||
|
||||
ipp_t *getPPDList()
|
||||
{
|
||||
ipp_t *request = newIppRequest();
|
||||
char str[1024];
|
||||
const char* server = cupsServer();
|
||||
int port = ippPort();
|
||||
|
||||
request->request.op.operation_id = CUPS_GET_PPDS;
|
||||
if ((!server) || (port < 0)) return NULL;
|
||||
sprintf(str,"ipp://%s:%d/printers/",cupsServer(),ippPort());
|
||||
ippAddString(request,IPP_TAG_OPERATION,IPP_TAG_URI,"printer-uri",NULL,str);
|
||||
//str.sprintf("/printers/%s",name);
|
||||
request = processRequest(request,"/");
|
||||
return request;
|
||||
}
|
||||
|
||||
/*
|
||||
* Main program
|
||||
*/
|
||||
|
||||
int /* O - exit state */
|
||||
main(int argc, /* I - Number of command-line arguments */
|
||||
char *argv[]) /* I - Command-line arguments */
|
||||
{
|
||||
int i,j; /* Looping vars */
|
||||
int makelen = 0; /* Length of current manufacturer name */
|
||||
int makelist = 0; /* List of manufacturers */
|
||||
int makegiven = 0; /* List of models for given manufacturer */
|
||||
int all = 0; /* LIst of all models */
|
||||
char *make; /* Chosen manufacturer */
|
||||
ipp_t *ppdlist; /* List of PPD files resulting from IPP */
|
||||
/* request */
|
||||
ipp_attribute_t *attr, /* Current attribute */
|
||||
*last; /* Last attribute */
|
||||
char *currmake, /* current data read from PPD list */
|
||||
*currmod,
|
||||
*currlang,
|
||||
*currfile,
|
||||
*currid,
|
||||
*c;
|
||||
char buffer[80],
|
||||
buffer2[256];
|
||||
int lineprinted = 1; /* Is the current line already printed to
|
||||
stdout */
|
||||
|
||||
// read command line arguments
|
||||
|
||||
for (i = 1; i < argc; i ++)
|
||||
if (argv[i][0] == '-') {
|
||||
switch (argv[i][1]) {
|
||||
case 'm' : /* Manufacturer options */
|
||||
if (argv[i][2] != '\0') {
|
||||
if (strcmp(argv[i],"-ml") == 0) {
|
||||
makelist = 1;
|
||||
} else {
|
||||
make = argv[i] + 2;
|
||||
makegiven = 1;
|
||||
}
|
||||
} else {
|
||||
i ++;
|
||||
if (!(make = argv[i])) return 1;
|
||||
makegiven = 1;
|
||||
}
|
||||
break;
|
||||
case 'a' : /* List all PPD files */
|
||||
all = 1;
|
||||
break;
|
||||
default :
|
||||
fprintf(stderr,"Unknown option \'%c\'!\n", argv[i][1]);
|
||||
fprintf(stderr,"Start program without options for help!\n");
|
||||
return(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr,"Unknown option \'%s\'!", argv[i]);
|
||||
fprintf(stderr,"Start program without options for help!\n");
|
||||
return(1);
|
||||
}
|
||||
if ((all) || (makegiven)) { // list all PPDs or PPDs of given manufacturer
|
||||
ppdlist = getPPDList();
|
||||
if (!ppdlist) return 1;
|
||||
for (attr = ppdlist->attrs; // go through all entries
|
||||
attr != NULL;
|
||||
attr = attr->next)
|
||||
if (attr->name) {
|
||||
// read data items
|
||||
if (strcmp(attr->name, "ppd-name") == 0) {
|
||||
currfile = attr->values[0].string.text;
|
||||
lineprinted = 0;
|
||||
} else if (strcmp(attr->name, "ppd-make") == 0) {
|
||||
currmake = attr->values[0].string.text;
|
||||
} else if (strcmp(attr->name, "ppd-make-and-model") == 0) {
|
||||
currmod = attr->values[0].string.text;
|
||||
} else if (strcmp(attr->name, "ppd-natural-language") == 0) {
|
||||
currlang = attr->values[0].string.text;
|
||||
} else if (strcmp(attr->name, "ppd-device-id") == 0) {
|
||||
currid = attr->values[0].string.text;
|
||||
}
|
||||
} else { // attr->name = NULL ==> data set completed
|
||||
lineprinted = 1;
|
||||
// Fill empty entries with some default stuff
|
||||
if (!currmod) currmod = "UNKNOWN";
|
||||
if (!currmake) currmake = "UNKNOWN";
|
||||
if (!currlang) currlang = "en";
|
||||
// Put data to stdout when "all" is chosen or when the manufacturer
|
||||
// matches the given one.
|
||||
if ((currfile) && ((all) || !strcasecmp(currmake,make))) {
|
||||
if (currid && (currid[0]))
|
||||
printf("%s|%s|%s|%s|%s\n",currfile,currmake,currmod,currlang,
|
||||
currid);
|
||||
else
|
||||
printf("%s|%s|%s|%s\n",currfile,currmake,currmod,currlang);
|
||||
}
|
||||
currfile = NULL; currmake = NULL; currmod = NULL;
|
||||
currlang = NULL; currid = NULL;
|
||||
}
|
||||
if (!lineprinted) {
|
||||
// Fill empty entries with some default stuff
|
||||
if (!currmod) currmod = "UNKNOWN";
|
||||
if (!currmake) currmake = "UNKNOWN";
|
||||
if (!currlang) currlang = "en";
|
||||
// Put data to stdout when "all" is chosen or when the manufacturer
|
||||
// matches the given one.
|
||||
if ((currfile) && ((all) || !strcasecmp(currmake,make))) {
|
||||
if (currid && (currid[0]))
|
||||
printf("%s|%s|%s|%s|%s\n",currfile,currmake,currmod,currlang,
|
||||
currid);
|
||||
else
|
||||
printf("%s|%s|%s|%s\n",currfile,currmake,currmod,currlang);
|
||||
}
|
||||
}
|
||||
} else if (makelist) { // list all manufacturers
|
||||
ppdlist = getPPDList();
|
||||
if (!ppdlist) return 1;
|
||||
for (attr = ppdlist->attrs, last = NULL; // go through all entries
|
||||
attr != NULL;
|
||||
attr = attr->next)
|
||||
if (attr->name && strcmp(attr->name, "ppd-make") == 0)
|
||||
// only search for manufacturerer entriees
|
||||
if (last == NULL ||
|
||||
strcasecmp(last->values[0].string.text,
|
||||
attr->values[0].string.text) != 0)
|
||||
// Do not take the same manufacturer twice
|
||||
{
|
||||
// Put found manufacturer to stdout
|
||||
printf("%s\n",attr->values[0].string.text);
|
||||
last = attr;
|
||||
}
|
||||
} else { // Help!
|
||||
fprintf(stderr,"Usage:\n");
|
||||
fprintf(stderr,"------\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," poll_ppd_base\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," This help page\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," poll_ppd_base -a\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," List all PPD files\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," poll_ppd_base -ml\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," List of all printer manufacturers supported by the PPD files installed\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," poll_ppd_base -m <manufacturers name>\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr," List of all supported printer models of this manufacturer\n");
|
||||
fprintf(stderr,"\n");
|
||||
fprintf(stderr,"ONLY WORKS WITH CUPS DAEMON RUNNING!\n");
|
||||
fprintf(stderr,"\n");
|
||||
return(1);
|
||||
}
|
||||
return(0);
|
||||
}
|
Loading…
Add table
Reference in a new issue