-CHANGES.txt - 2009-03-23
+CHANGES.txt - 2009-04-03
------------------------
CHANGES IN CUPS V1.4b3
- Documentation fixes (STR #3044, STR #3057)
+ - Added complete localizations for German, Japanese, Polish, and
+ Russian and partial localizations for Chinese, Danish, Finnish,
+ French, Italian, Korean, Norwegian, Portuguese, and Swedish
+ (STR #3096, STR #3098, STR #3109, STR #3111, STR #3141)
+ - cupsWriteRequestData() flushed the output buffer unnecessarily,
+ causing reduced performance in some situations.
- If a CGI process died before sending its MIME headers, the request
would hang on the client.
- The printer/class/job search feature on the web interface did not
devices (STR #3108)
- The cupsSideChannelSNMP* functions did not work.
- The scheduler could consume 100% CPU when jobs were canceled.
- - Added complete localizations for Japanese, Polish, and Russian and
- partial localizations for Chinese, Danish, German, Finnish, French,
- Italian, Korean, Norwegian, Portuguese, and Swedish (STR #3096,
- STR #3098, STR #3109, STR #3111)
- Clicking on "Select Another Make/Manufacturer" in the web interface
incorrectly added the printer (STR #3095)
- The scheduler no longer uses programs with insecure file
* resolved service name.
* get_device() - Create or update a device.
* query_callback() - Process query data.
+ * sigterm_handler() - Handle termination signals...
* unquote() - Unquote a name string.
*/
} cups_device_t;
+/*
+ * Local globals...
+ */
+
+static int job_canceled = 0;
+ /* Set to 1 on SIGTERM */
+
+
/*
* Local functions...
*/
uint16_t rrclass, uint16_t rdlen,
const void *rdata, uint32_t ttl,
void *context);
+static void sigterm_handler(int sig);
static void unquote(char *dst, const char *src, size_t dstsize);
cups_array_t *devices; /* Device array */
cups_device_t *device; /* Current device */
char uriName[1024]; /* Unquoted fullName for URI */
+#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
+ struct sigaction action; /* Actions for POSIX signals */
+#endif /* HAVE_SIGACTION && !HAVE_SIGSET */
/*
- * Check command-line...
+ * Don't buffer stderr, and catch SIGTERM...
*/
setbuf(stderr, NULL);
+#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
+ sigset(SIGTERM, sigterm_handler);
+#elif defined(HAVE_SIGACTION)
+ memset(&action, 0, sizeof(action));
+
+ sigemptyset(&action.sa_mask);
+ action.sa_handler = SIG_IGN;
+ sigaction(SIGTERM, &action, sigterm_handler);
+#else
+ signal(SIGTERM, sigterm_handler);
+#endif /* HAVE_SIGSET */
+
+ /*
+ * Check command-line...
+ */
+
if (argc >= 6)
exec_backend(argv);
else if (argc != 1)
* Loop until we are killed...
*/
- for (;;)
+ while (!job_canceled)
{
FD_ZERO(&input);
FD_SET(fd, &input);
cups_device_t *best; /* Best matching device */
char device_uri[1024]; /* Device URI */
int count; /* Number of queries */
- static const char * const schemes[] =
- { "lpd", "ipp", "ipp", "socket", "riousbprint" };
- /* URI schemes for devices */
for (device = (cups_device_t *)cupsArrayFirst(devices),
unquote(uriName, best->fullName, sizeof(uriName));
httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri),
- schemes[best->type], NULL, uriName, 0,
+ "dnssd", NULL, uriName, 0,
best->cups_shared ? "/cups" : "/");
cupsBackendReport("network", device_uri, best->make_and_model,
unquote(uriName, best->fullName, sizeof(uriName));
httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri),
- schemes[best->type], NULL, uriName, 0,
+ "dnssd", NULL, uriName, 0,
best->cups_shared ? "/cups" : "/");
cupsBackendReport("network", device_uri, best->make_and_model,
}
}
}
+
+ return (CUPS_BACKEND_OK);
}
compare_devices(cups_device_t *a, /* I - First device */
cups_device_t *b) /* I - Second device */
{
- int result = strcmp(a->name, b->name);
-
- if (result)
- return (result);
- else
- return (strcmp(a->domain, b->domain));
+ return (strcmp(a->name, b->name));
}
*/
if ((resolved_uri = cupsBackendDeviceURI(argv)) == NULL)
- exit(CUPS_BACKEND_FAILED);
+ {
+ if (job_canceled)
+ exit(CUPS_BACKEND_OK);
+ else
+ exit(CUPS_BACKEND_FAILED);
+ }
/*
* Extract the scheme from the URI...
snprintf(filename, sizeof(filename), "%s/backend/%s", cups_serverbin, scheme);
/*
- * Overwrite the device URIs and run the new backend...
+ * Overwrite the device URI and run the new backend...
*/
setenv("DEVICE_URI", resolved_uri, 1);
* See if this is a new device...
*/
- key.name = (char *)serviceName;
- key.domain = (char *)replyDomain;
+ key.name = (char *)serviceName;
if (!strcmp(regtype, "_ipp._tcp.") ||
!strcmp(regtype, "_ipp-tls._tcp."))
for (device = cupsArrayFind(devices, &key);
device;
device = cupsArrayNext(devices))
- if (strcasecmp(device->name, key.name) ||
- strcasecmp(device->domain, key.domain))
+ if (strcasecmp(device->name, key.name))
break;
else if (device->type == key.type)
+ {
+ if (!strcasecmp(device->domain, "local.") &&
+ strcasecmp(device->domain, replyDomain))
+ {
+ /*
+ * Update the .local listing to use the "global" domain name instead.
+ * The backend will try local lookups first, then the global domain name.
+ */
+
+ free(device->domain);
+ device->domain = strdup(replyDomain);
+
+ DNSServiceConstructFullName(fullName, device->name, regtype,
+ replyDomain);
+ free(device->fullName);
+ device->fullName = strdup(fullName);
+ }
+
return (device);
+ }
/*
* Yes, add the device...
}
+/*
+ * 'sigterm_handler()' - Handle termination signals...
+ */
+
+static void
+sigterm_handler(int sig) /* I - Signal number (unused) */
+{
+ job_canceled = 1;
+}
+
+
/*
* 'unquote()' - Unquote a name string.
*/
*
* Serial port backend for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
{
CFTypeRef serialNameAsCFString;
CFTypeRef bsdPathAsCFString;
+ CFTypeRef hiddenVal;
char serialName[128];
char bsdPath[1024];
Boolean result;
- serialNameAsCFString =
- IORegistryEntryCreateCFProperty(serialService,
- CFSTR(kIOTTYDeviceKey),
- kCFAllocatorDefault, 0);
- if (serialNameAsCFString)
+ /* Check if hidden... */
+ hiddenVal = IORegistryEntrySearchCFProperty(serialService,
+ kIOServicePlane,
+ CFSTR("HiddenPort"),
+ kCFAllocatorDefault,
+ kIORegistryIterateRecursively |
+ kIORegistryIterateParents);
+ if (hiddenVal)
+ CFRelease(hiddenVal); /* This interface should not be used */
+ else
{
- result = CFStringGetCString(serialNameAsCFString, serialName,
- sizeof(serialName),
- kCFStringEncodingASCII);
- CFRelease(serialNameAsCFString);
-
- if (result)
+ serialNameAsCFString =
+ IORegistryEntryCreateCFProperty(serialService,
+ CFSTR(kIOTTYDeviceKey),
+ kCFAllocatorDefault, 0);
+ if (serialNameAsCFString)
{
- bsdPathAsCFString =
- IORegistryEntryCreateCFProperty(serialService,
- CFSTR(kIOCalloutDeviceKey),
- kCFAllocatorDefault, 0);
- if (bsdPathAsCFString)
+ result = CFStringGetCString(serialNameAsCFString, serialName,
+ sizeof(serialName),
+ kCFStringEncodingASCII);
+ CFRelease(serialNameAsCFString);
+
+ if (result)
{
- result = CFStringGetCString(bsdPathAsCFString, bsdPath,
- sizeof(bsdPath),
- kCFStringEncodingASCII);
- CFRelease(bsdPathAsCFString);
-
- if (result)
- printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n",
- bsdPath, serialName);
+ bsdPathAsCFString =
+ IORegistryEntryCreateCFProperty(serialService,
+ CFSTR(kIOCalloutDeviceKey),
+ kCFAllocatorDefault, 0);
+ if (bsdPathAsCFString)
+ {
+ result = CFStringGetCString(bsdPathAsCFString, bsdPath,
+ sizeof(bsdPath),
+ kCFStringEncodingASCII);
+ CFRelease(bsdPathAsCFString);
+
+ if (result)
+ printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n",
+ bsdPath, serialName);
+ }
}
}
}
cups_option_t **options)
_CUPS_API_1_4;
extern ipp_status_t cupsGetDevices(http_t *http, int timeout,
- const char *exclude_schemes,
const char *include_schemes,
+ const char *exclude_schemes,
cups_device_cb_t callback,
void *user_data) _CUPS_API_1_4;
extern cups_dest_t *cupsGetNamedDest(http_t *http, const char *name,
#ifndef _CUPS_DEBUG_H_
# define _CUPS_DEBUG_H_
+/*
+ * C++ magic...
+ */
+
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
+
+
/*
* The debug macros are used if you compile with DEBUG defined.
*
;
extern void _cups_debug_puts(const char *s);
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
#endif /* !_CUPS_DEBUG_H_ */
#ifdef __APPLE__
static CFArrayRef appleCopyLocations(void);
static CFStringRef appleCopyNetwork(void);
-static char *appleGetDefault(char *name, int namesize);
static char *appleGetPaperSize(char *name, int namesize);
static CFStringRef appleGetPrinter(CFArrayRef locations, CFStringRef network,
CFIndex *locindex);
static char *cups_get_default(const char *filename, char *namebuf,
size_t namesize, const char **instance);
static int cups_get_dests(const char *filename, const char *match_name,
- const char *match_inst, int num_dests,
- cups_dest_t **dests);
+ const char *match_inst, int user_default_set,
+ int num_dests, cups_dest_t **dests);
static int cups_get_sdests(http_t *http, ipp_op_t op, const char *name,
int num_dests, cups_dest_t **dests);
static char *cups_make_string(ipp_attribute_t *attr, char *buffer,
char filename[1024]; /* Local ~/.cups/lpoptions file */
const char *defprinter; /* Default printer */
char name[1024], /* Copy of printer name */
- *instance; /* Pointer to instance name */
+ *instance, /* Pointer to instance name */
+ *user_default; /* User default printer */
int num_reals; /* Number of real queues */
cups_dest_t *reals; /* Real queues */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
* Grab the default destination...
*/
-#ifdef __APPLE__
- if ((defprinter = appleGetDefault(name, sizeof(name))) == NULL)
-#endif /* __APPLE__ */
- defprinter = cupsGetDefault2(http);
+ if ((user_default = _cupsUserDefault(name, sizeof(name))) != NULL)
+ defprinter = name;
+ else if ((defprinter = cupsGetDefault2(http)) != NULL)
+ {
+ strlcpy(name, defprinter, sizeof(name));
+ defprinter = name;
+ }
if (defprinter)
{
/*
- * Grab printer and instance name...
+ * Separate printer and instance name...
*/
-#ifdef __APPLE__
- if (name != defprinter)
-#endif /* __APPLE__ */
- strlcpy(name, defprinter, sizeof(name));
-
if ((instance = strchr(name, '/')) != NULL)
*instance++ = '\0';
dest->is_default = 1;
}
else
- {
- /*
- * This initialization of "instance" is unnecessary, but avoids a
- * compiler warning...
- */
-
instance = NULL;
- }
/*
* Load the /etc/cups/lpoptions and ~/.cups/lpoptions files...
*/
snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
- num_dests = cups_get_dests(filename, NULL, NULL, num_dests, dests);
+ num_dests = cups_get_dests(filename, NULL, NULL, user_default != NULL,
+ num_dests, dests);
if ((home = getenv("HOME")) != NULL)
{
if (access(filename, 0))
snprintf(filename, sizeof(filename), "%s/.lpoptions", home);
- num_dests = cups_get_dests(filename, NULL, NULL, num_dests, dests);
+ num_dests = cups_get_dests(filename, NULL, NULL, user_default != NULL,
+ num_dests, dests);
}
/*
char filename[1024], /* Path to lpoptions */
defname[256]; /* Default printer name */
const char *home = getenv("HOME"); /* Home directory */
+ int set_as_default = 0; /* Set returned destination as default */
ipp_op_t op = IPP_GET_PRINTER_ATTRIBUTES;
/* IPP operation to get server ops */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
if (!name)
{
- if ((name = getenv("LPDEST")) == NULL)
- if ((name = getenv("PRINTER")) != NULL && !strcmp(name, "lp"))
- name = NULL;
+ set_as_default = 1;
+ name = _cupsUserDefault(defname, sizeof(defname));
if (!name && home)
{
if (instance)
dest->instance = _cupsStrAlloc(instance);
+ if (set_as_default)
+ dest->is_default = 1;
+
/*
* Then add local options...
*/
snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot);
- cups_get_dests(filename, name, instance, 1, &dest);
+ cups_get_dests(filename, name, instance, 1, 1, &dest);
if (home)
{
if (access(filename, 0))
snprintf(filename, sizeof(filename), "%s/.lpoptions", home);
- cups_get_dests(filename, name, instance, 1, &dest);
+ cups_get_dests(filename, name, instance, 1, 1, &dest);
}
/*
* Merge in server defaults...
*/
- num_temps = cups_get_dests(filename, NULL, NULL, num_temps, &temps);
+ num_temps = cups_get_dests(filename, NULL, NULL, 0, num_temps, &temps);
/*
* Point to user defaults...
}
+/*
+ * '_cupsUserDefault()' - Get the user default printer from environment
+ * variables and location information.
+ */
+
+char * /* O - Default printer or NULL */
+_cupsUserDefault(char *name, /* I - Name buffer */
+ size_t namesize) /* I - Size of name buffer */
+{
+ const char *env; /* LPDEST or PRINTER env variable */
+#ifdef __APPLE__
+ CFStringRef network; /* Network location */
+ CFArrayRef locations; /* Location array */
+ CFStringRef locprinter; /* Current printer */
+#endif /* __APPLE__ */
+
+
+ if ((env = getenv("LPDEST")) == NULL)
+ if ((env = getenv("PRINTER")) != NULL && !strcmp(env, "lp"))
+ env = NULL;
+
+ if (env)
+ {
+ strlcpy(name, env, namesize);
+ return (name);
+ }
+
+#ifdef __APPLE__
+ /*
+ * Use location-based defaults if "use last printer" is selected in the
+ * system preferences...
+ */
+
+ if (!appleUseLastPrinter())
+ {
+ DEBUG_puts("_cupsUserDefault: Not using last printer as default...");
+ name[0] = '\0';
+ return (NULL);
+ }
+
+ /*
+ * Get the current location...
+ */
+
+ if ((network = appleCopyNetwork()) == NULL)
+ {
+ DEBUG_puts("_cupsUserDefault: Unable to get current network...");
+ name[0] = '\0';
+ return (NULL);
+ }
+
+# ifdef DEBUG
+ CFStringGetCString(network, name, namesize, kCFStringEncodingUTF8);
+ DEBUG_printf(("_cupsUserDefault: network=\"%s\"\n", name));
+# endif /* DEBUG */
+
+ /*
+ * Lookup the network in the preferences...
+ */
+
+ if ((locations = appleCopyLocations()) == NULL)
+ {
+ /*
+ * Missing or bad location array, so no location-based default...
+ */
+
+ DEBUG_puts("_cupsUserDefault: Missing or bad location history array...");
+
+ CFRelease(network);
+
+ name[0] = '\0';
+ return (NULL);
+ }
+
+ DEBUG_printf(("_cupsUserDefault: Got location, %d entries...\n",
+ (int)CFArrayGetCount(locations)));
+
+ if ((locprinter = appleGetPrinter(locations, network, NULL)) != NULL)
+ CFStringGetCString(locprinter, name, namesize, kCFStringEncodingUTF8);
+ else
+ name[0] = '\0';
+
+ CFRelease(network);
+ CFRelease(locations);
+
+ DEBUG_printf(("_cupsUserDefault: Returning \"%s\"...\n", name));
+
+ return (*name ? name : NULL);
+
+#else
+ /*
+ * No location-based defaults on this platform...
+ */
+
+ name[0] = '\0';
+ return (NULL);
+#endif /* __APPLE__ */
+}
+
+
#ifdef __APPLE__
/*
* 'appleCopyLocations()' - Copy the location history array.
}
-/*
- * 'appleGetDefault()' - Get the default printer for this location.
- */
-
-static char * /* O - Name or NULL if no default */
-appleGetDefault(char *name, /* I - Name buffer */
- int namesize) /* I - Size of name buffer */
-{
- CFStringRef network; /* Network location */
- CFArrayRef locations; /* Location array */
- CFStringRef locprinter; /* Current printer */
-
-
- /*
- * Use location-based defaults if "use last printer" is selected in the
- * system preferences...
- */
-
- if (!appleUseLastPrinter())
- {
- DEBUG_puts("appleGetDefault: Not using last printer as default...");
- return (NULL);
- }
-
- /*
- * Get the current location...
- */
-
- if ((network = appleCopyNetwork()) == NULL)
- {
- DEBUG_puts("appleGetDefault: Unable to get current network...");
- return (NULL);
- }
-
-#ifdef DEBUG
- CFStringGetCString(network, name, namesize, kCFStringEncodingUTF8);
- DEBUG_printf(("appleGetDefault: network=\"%s\"\n", name));
-#endif /* DEBUG */
-
- /*
- * Lookup the network in the preferences...
- */
-
- if ((locations = appleCopyLocations()) == NULL)
- {
- /*
- * Missing or bad location array, so no location-based default...
- */
-
- DEBUG_puts("appleGetDefault: Missing or bad location history array...");
-
- CFRelease(network);
-
- return (NULL);
- }
-
- DEBUG_printf(("appleGetDefault: Got location, %d entries...\n",
- (int)CFArrayGetCount(locations)));
-
- if ((locprinter = appleGetPrinter(locations, network, NULL)) != NULL)
- CFStringGetCString(locprinter, name, namesize, kCFStringEncodingUTF8);
- else
- name[0] = '\0';
-
- CFRelease(network);
- CFRelease(locations);
-
- DEBUG_printf(("appleGetDefault: Returning \"%s\"...\n", name));
-
- return (*name ? name : NULL);
-}
-
-
/*
* 'appleGetPaperSize()' - Get the default paper size.
*/
CFPreferencesSetAppValue(kLocationHistoryArrayKey, newlocations,
kPMPrintingPreferences);
CFPreferencesAppSynchronize(kPMPrintingPreferences);
+ notify_post("com.apple.printerPrefsChange");
}
if (newlocations)
*/
static int /* O - Number of destinations */
-cups_get_dests(const char *filename, /* I - File to read from */
- const char *match_name, /* I - Destination name we want */
- const char *match_inst, /* I - Instance name we want */
- int num_dests, /* I - Number of destinations */
- cups_dest_t **dests) /* IO - Destinations */
+cups_get_dests(
+ const char *filename, /* I - File to read from */
+ const char *match_name, /* I - Destination name we want */
+ const char *match_inst, /* I - Instance name we want */
+ int user_default_set, /* I - User default printer set? */
+ int num_dests, /* I - Number of destinations */
+ cups_dest_t **dests) /* IO - Destinations */
{
int i; /* Looping var */
cups_dest_t *dest; /* Current destination */
*name, /* Name of destination/option */
*instance; /* Instance of destination */
int linenum; /* Current line number */
- const char *printer; /* PRINTER or LPDEST */
DEBUG_printf(("cups_get_dests(filename=\"%s\", match_name=\"%s\", "
- "match_inst=\"%s\", num_dests=%d, dests=%p)\n", filename,
- match_name ? match_name : "(null)",
- match_inst ? match_inst : "(null)", num_dests, dests));
+ "match_inst=\"%s\", user_default_set=%d, num_dests=%d, "
+ "dests=%p)\n", filename, match_name, match_inst,
+ user_default_set, num_dests, dests));
/*
* Try to open the file...
if ((fp = cupsFileOpen(filename, "r")) == NULL)
return (num_dests);
- /*
- * Check environment variables...
- */
-
- if ((printer = getenv("LPDEST")) == NULL)
- if ((printer = getenv("PRINTER")) != NULL)
- if (strcmp(printer, "lp") == 0)
- printer = NULL;
-
- DEBUG_printf(("cups_get_dests: printer=\"%s\"\n",
- printer ? printer : "(null)"));
-
/*
* Read each printer; each line looks like:
*
*/
DEBUG_printf(("cups_get_dests: linenum=%d line=\"%s\" lineptr=\"%s\"\n",
- linenum, line, lineptr ? lineptr : "(null)"));
+ linenum, line, lineptr));
if ((strcasecmp(line, "dest") && strcasecmp(line, "default")) || !lineptr)
{
* Set this as default if needed...
*/
- if (!printer && !strcasecmp(line, "default"))
+ if (!user_default_set && !strcasecmp(line, "default"))
{
DEBUG_puts("cups_get_dests: Setting as default...");
extern void _cupsSetError(ipp_status_t status, const char *message,
int localize);
extern void _cupsSetHTTPError(http_status_t status);
+extern char *_cupsUserDefault(char *name, size_t namesize);
/*
size_t dstsize);
extern const char *_httpResolveURI(const char *uri, char *resolved_uri,
size_t resolved_size, int log);
+extern int _httpWait(http_t *http, int msec, int usessl);
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
/*
#include <stdlib.h>
#ifdef HAVE_DNSSD
# include <dns_sd.h>
+# include <poll.h>
#endif /* HAVE_DNSSD */
if (strstr(hostname, "._tcp"))
{
#ifdef HAVE_DNSSD
- DNSServiceRef ref; /* DNS-SD service reference */
+ DNSServiceRef ref, /* DNS-SD master service reference */
+ domainref, /* DNS-SD service reference for domain */
+ localref; /* DNS-SD service reference for .local */
+ int domainsent = 0; /* Send the domain resolve? */
char *regtype, /* Pointer to type in hostname */
*domain; /* Pointer to domain in hostname */
_http_uribuf_t uribuf; /* URI buffer */
+ struct pollfd polldata; /* Polling data */
+
+
+ if (logit)
+ fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname);
/*
* Separate the hostname into service name, registration type, and domain...
return (NULL);
}
- domain = regtype + strlen(regtype) - 1;
- if (domain > regtype && *domain == '.')
- *domain = '\0';
-
for (domain = strchr(regtype, '.');
domain;
domain = strchr(domain + 1, '.'))
if (logit)
{
fputs("STATE: +connecting-to-device\n", stderr);
- fprintf(stderr, "DEBUG: Resolving %s, regtype=%s, domain=%s...\n",
- hostname, regtype, domain);
+ fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
+ "domain=\"local.\"...\n", hostname, regtype);
_cupsLangPuts(stderr, _("INFO: Looking for printer...\n"));
}
- if (DNSServiceResolve(&ref, 0, 0, hostname, regtype, domain,
- resolve_callback,
- &uribuf) == kDNSServiceErr_NoError)
+ uri = NULL;
+
+ if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError)
{
- if (DNSServiceProcessResult(ref) != kDNSServiceErr_NoError &&
- resolved_uri[0])
- uri = NULL;
- else
- uri = resolved_uri;
+ localref = ref;
+ if (DNSServiceResolve(&localref, kDNSServiceFlagsShareConnection, 0,
+ hostname, regtype, "local.", resolve_callback,
+ &uribuf) == kDNSServiceErr_NoError)
+ {
+ if (strcasecmp(domain, "local."))
+ {
+ /*
+ * Wait 2 seconds for a response to the local resolve; if nothing comes
+ * in, do an additional domain resolution...
+ */
+
+ polldata.fd = DNSServiceRefSockFD(ref);
+ polldata.events = POLLIN;
+
+ if (poll(&polldata, 1, 2000) != 1)
+ {
+ /*
+ * OK, send the domain name resolve...
+ */
+
+ if (logit)
+ fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
+ "domain=\"%s\"...\n", hostname, regtype, domain);
+
+ domainref = ref;
+ if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, 0,
+ hostname, regtype, domain, resolve_callback,
+ &uribuf) == kDNSServiceErr_NoError)
+ domainsent = 1;
+ }
+ }
+
+ if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError)
+ uri = resolved_uri;
+
+ if (domainsent)
+ DNSServiceRefDeallocate(domainref);
+
+ DNSServiceRefDeallocate(localref);
+ }
DNSServiceRefDeallocate(ref);
}
- else
- uri = NULL;
if (logit)
+ {
+ if (uri)
+ fputs("DEBUG: Unable to resolve URI!\n", stderr);
+ else
+ fprintf(stderr, "DEBUG: Resolved as \"%s\"...\n", uri);
+
fputs("STATE: -connecting-to-device\n", stderr);
+ }
#else
/*
*
* HTTP routines for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* This file contains Kerberos support code, copyright 2006 by
*
* _httpBIOMethods() - Get the OpenSSL BIO methods for HTTP connections.
* httpBlocking() - Set blocking/non-blocking behavior on a connection.
- * httpCheck() - Check to see if there is a pending response from
- * the server.
+ * httpCheck() - Check to see if there is a pending response from the
+ * server.
* httpClearCookie() - Clear the cookie value(s).
* httpClearFields() - Clear HTTP request fields.
* httpClose() - Close an HTTP connection...
* httpConnect() - Connect to a HTTP server.
* httpConnectEncrypt() - Connect to a HTTP server using encryption.
+ * _httpCreate() - Create an unconnected HTTP connection.
* httpDelete() - Send a DELETE request to the server.
* httpEncryption() - Set the required encryption on the link.
* httpError() - Get the last error on a connection.
* content-length or transfer-encoding fields.
* httpGetStatus() - Get the status of the last HTTP request.
* httpGetSubField() - Get a sub-field value.
+ * httpGetSubField2() - Get a sub-field value.
* httpGets() - Get a line of text from a HTTP connection.
* httpHead() - Send a HEAD request to the server.
* httpInitialize() - Initialize the HTTP interface library and set the
* httpRead2() - Read data from a HTTP connection.
* _httpReadCDSA() - Read function for the CDSA library.
* _httpReadGNUTLS() - Read function for the GNU TLS library.
- * httpReconnect() - Reconnect to a HTTP server...
+ * httpReconnect() - Reconnect to a HTTP server.
* httpSetAuthString() - Set the current authorization string.
* httpSetCookie() - Set the cookie value(s)...
* httpSetExpect() - Set the Expect: header in a request.
* httpSetField() - Set the value of an HTTP header.
- * httpSetLength() - Set the content-length and transfer-encoding.
+ * httpSetLength() - Set the content-length and content-encoding.
* httpTrace() - Send an TRACE request to the server.
* httpUpdate() - Update the current HTTP state for incoming data.
+ * _httpWait() - Wait for data available on a connection (no flush).
* httpWait() - Wait for data available on a connection.
* httpWrite() - Write data to a HTTP connection.
* httpWrite2() - Write data to a HTTP connection.
* http_read_ssl() - Read from a SSL/TLS connection.
* http_send() - Send a request with all fields and the trailing
* blank line.
- * http_setup_ssl() - Set up SSL/TLS on a connection.
+ * http_setup_ssl() - Set up SSL/TLS support on a connection.
* http_shutdown_ssl() - Shut down SSL/TLS on a connection.
* http_upgrade() - Force upgrade to TLS encryption.
- * http_wait() - Wait for data available on a connection.
- * http_write() - Write data to a connection.
+ * http_write() - Write a buffer to a HTTP connection.
+ * http_write_chunk() - Write a chunked buffer.
* http_write_ssl() - Write to a SSL/TLS connection.
*/
static http_field_t http_field(const char *name);
static int http_send(http_t *http, http_state_t request,
const char *uri);
-static int http_wait(http_t *http, int msec, int usessl);
static int http_write(http_t *http, const char *buffer,
int length);
static int http_write_chunk(http_t *http, const char *buffer,
* No newline; see if there is more data to be read...
*/
- if (!http->blocking && !http_wait(http, 10000, 1))
+ if (!http->blocking && !_httpWait(http, 10000, 1))
{
DEBUG_puts("httpGets: Timed out!");
#ifdef WIN32
* Make sure we have data before we read...
*/
- if (!http_wait(http, 10000, 0))
+ if (!_httpWait(http, 10000, 0))
{
http->error = ETIMEDOUT;
return (-1);
* Make sure we have data before we read...
*/
- if (!http_wait(http, 10000, 0))
+ if (!_httpWait(http, 10000, 0))
{
http->error = ETIMEDOUT;
return (-1);
}
+/*
+ * '_httpWait()' - Wait for data available on a connection (no flush).
+ */
+
+int /* O - 1 if data is available, 0 otherwise */
+_httpWait(http_t *http, /* I - Connection to server */
+ int msec, /* I - Milliseconds to wait */
+ int usessl) /* I - Use SSL context? */
+{
+#ifdef HAVE_POLL
+ struct pollfd pfd; /* Polled file descriptor */
+#else
+ fd_set input_set; /* select() input set */
+ struct timeval timeout; /* Timeout */
+#endif /* HAVE_POLL */
+ int nfds; /* Result from select()/poll() */
+
+
+ DEBUG_printf(("_httpWait(http=%p, msec=%d, usessl=%d)\n", http, msec, usessl));
+
+ if (http->fd < 0)
+ return (0);
+
+ /*
+ * Check the SSL/TLS buffers for data first...
+ */
+
+#ifdef HAVE_SSL
+ if (http->tls && usessl)
+ {
+# ifdef HAVE_LIBSSL
+ if (SSL_pending((SSL *)(http->tls)))
+ return (1);
+# elif defined(HAVE_GNUTLS)
+ if (gnutls_record_check_pending(((http_tls_t *)(http->tls))->session))
+ return (1);
+# elif defined(HAVE_CDSASSL)
+ size_t bytes; /* Bytes that are available */
+
+ if (!SSLGetBufferedReadSize(((http_tls_t *)(http->tls))->session, &bytes) &&
+ bytes > 0)
+ return (1);
+# endif /* HAVE_LIBSSL */
+ }
+#endif /* HAVE_SSL */
+
+ /*
+ * Then try doing a select() or poll() to poll the socket...
+ */
+
+#ifdef HAVE_POLL
+ pfd.fd = http->fd;
+ pfd.events = POLLIN;
+
+ while ((nfds = poll(&pfd, 1, msec)) < 0 && errno == EINTR);
+
+#else
+ do
+ {
+ FD_ZERO(&input_set);
+ FD_SET(http->fd, &input_set);
+
+ DEBUG_printf(("_httpWait: msec=%d, http->fd=%d\n", msec, http->fd));
+
+ if (msec >= 0)
+ {
+ timeout.tv_sec = msec / 1000;
+ timeout.tv_usec = (msec % 1000) * 1000;
+
+ nfds = select(http->fd + 1, &input_set, NULL, NULL, &timeout);
+ }
+ else
+ nfds = select(http->fd + 1, &input_set, NULL, NULL, NULL);
+
+ DEBUG_printf(("_httpWait: select() returned %d...\n", nfds));
+ }
+# ifdef WIN32
+ while (nfds < 0 && WSAGetLastError() == WSAEINTR);
+# else
+ while (nfds < 0 && errno == EINTR);
+# endif /* WIN32 */
+#endif /* HAVE_POLL */
+
+ DEBUG_printf(("_httpWait: returning with nfds=%d...\n", nfds));
+
+ return (nfds > 0);
+}
+
+
/*
* 'httpWait()' - Wait for data available on a connection.
*
* If not, check the SSL/TLS buffers and do a select() on the connection...
*/
- return (http_wait(http, msec, 1));
+ return (_httpWait(http, msec, 1));
}
httpFlushWrite(http);
}
- if ((length + http->wused) <= sizeof(http->wbuffer))
+ if ((length + http->wused) <= sizeof(http->wbuffer) &&
+ length < sizeof(http->wbuffer))
{
/*
* Write to buffer...
* Make sure we have data before we read...
*/
- if (!http_wait(http, 10000, 0))
+ if (!_httpWait(http, 10000, 0))
{
#ifdef WIN32
http->error = WSAETIMEDOUT;
#endif /* HAVE_SSL */
-/*
- * 'http_wait()' - Wait for data available on a connection.
- */
-
-static int /* O - 1 if data is available, 0 otherwise */
-http_wait(http_t *http, /* I - Connection to server */
- int msec, /* I - Milliseconds to wait */
- int usessl) /* I - Use SSL context? */
-{
-#ifdef HAVE_POLL
- struct pollfd pfd; /* Polled file descriptor */
-#else
- fd_set input_set; /* select() input set */
- struct timeval timeout; /* Timeout */
-#endif /* HAVE_POLL */
- int nfds; /* Result from select()/poll() */
-
-
- DEBUG_printf(("http_wait(http=%p, msec=%d)\n", http, msec));
-
- if (http->fd < 0)
- return (0);
-
- /*
- * Check the SSL/TLS buffers for data first...
- */
-
-#ifdef HAVE_SSL
- if (http->tls && usessl)
- {
-# ifdef HAVE_LIBSSL
- if (SSL_pending((SSL *)(http->tls)))
- return (1);
-# elif defined(HAVE_GNUTLS)
- if (gnutls_record_check_pending(((http_tls_t *)(http->tls))->session))
- return (1);
-# elif defined(HAVE_CDSASSL)
- size_t bytes; /* Bytes that are available */
-
- if (!SSLGetBufferedReadSize(((http_tls_t *)(http->tls))->session, &bytes) &&
- bytes > 0)
- return (1);
-# endif /* HAVE_LIBSSL */
- }
-#endif /* HAVE_SSL */
-
- /*
- * Then try doing a select() or poll() to poll the socket...
- */
-
-#ifdef HAVE_POLL
- pfd.fd = http->fd;
- pfd.events = POLLIN;
-
- while ((nfds = poll(&pfd, 1, msec)) < 0 && errno == EINTR);
-
-#else
- do
- {
- FD_ZERO(&input_set);
- FD_SET(http->fd, &input_set);
-
- DEBUG_printf(("http_wait: msec=%d, http->fd=%d\n", msec, http->fd));
-
- if (msec >= 0)
- {
- timeout.tv_sec = msec / 1000;
- timeout.tv_usec = (msec % 1000) * 1000;
-
- nfds = select(http->fd + 1, &input_set, NULL, NULL, &timeout);
- }
- else
- nfds = select(http->fd + 1, &input_set, NULL, NULL, NULL);
-
- DEBUG_printf(("http_wait: select() returned %d...\n", nfds));
- }
-# ifdef WIN32
- while (nfds < 0 && WSAGetLastError() == WSAEINTR);
-# else
- while (nfds < 0 && errno == EINTR);
-# endif /* WIN32 */
-#endif /* HAVE_POLL */
-
- DEBUG_printf(("http_wait: returning with nfds=%d...\n", nfds));
-
- return (nfds > 0);
-}
-
-
/*
* 'http_write()' - Write a buffer to a HTTP connection.
*/
_ippReadFile
_ippReadIO
_ippSetPort
+_ippTagString
+_ippTagValue
_ippTimeToDate
_ippWrite
_ippWriteFile
const char *buffer, /* I - Bytes to write */
size_t length) /* I - Number of bytes to write */
{
+ int wused; /* Previous bytes in buffer */
+
+
/*
* Get the default connection as needed...
*/
* Then write to the HTTP connection...
*/
+ wused = http->wused;
+
if (httpWrite2(http, buffer, length) < 0)
return (HTTP_ERROR);
* Finally, check if we have any pending data from the server...
*/
- if (httpCheck(http))
- return (httpUpdate(http));
- else
- return (HTTP_CONTINUE);
+ if (length > HTTP_MAX_BUFFER ||
+ http->wused < wused ||
+ (wused > 0 && http->wused == length))
+ {
+ /*
+ * We've written something to the server, so check for response data...
+ */
+
+ if (_httpWait(http, 0, 1))
+ return (httpUpdate(http));
+ }
+
+ return (HTTP_CONTINUE);
}
printf("_httpResolveURI(%s): ", argv[1]);
fflush(stdout);
- if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), 0))
+ if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), 1))
{
puts("FAIL");
return (1);
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
- const char *var; /* Environment variable */
_cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */
/*
- * First see if the LPDEST or PRINTER environment variables are
- * set... However, if PRINTER is set to "lp", ignore it to work
- * around a "feature" in most Linux distributions - the default
- * user login scripts set PRINTER to "lp"...
+ * See if we have a user default printer set...
*/
- if ((var = getenv("LPDEST")) != NULL)
- return (var);
- else if ((var = getenv("PRINTER")) != NULL && strcmp(var, "lp") != 0)
- return (var);
+ if (_cupsUserDefault(cg->def_printer, sizeof(cg->def_printer)))
+ return (cg->def_printer);
/*
* Connect to the server as needed...
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.png" TYPE="image/png">
+</HEAD>
+<BODY>
+<TABLE CLASS="page" SUMMARY="{title}">
+<TR><TD CLASS="body">
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
+<TR HEIGHT="36">
+<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
+SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
+<TD CLASS="sel"><A HREF="/"> Startseite </A></TD>
+<TD CLASS="unsel"><A HREF="/admin"> Verwaltung </A></TD>
+<TD CLASS="unsel"><A HREF="/classes/"> Klassen </A></TD>
+<TD CLASS="unsel"><A HREF="/help/"> On-Line Hilfe </A></TD>
+<TD CLASS="unsel"><A HREF="/jobs/"> Auftrüge </A></TD>
+<TD CLASS="unsel"><A HREF="/printers/"> Drucker </A></TD>
+<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
+TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
+AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
+<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
+</TR>
+</TABLE>
+
+<TABLE CLASS="indent" SUMMARY="">
+<TR><TD STYLE="padding-right: 20px;">
+
+<H1>Common UNIX Printing System @CUPS_VERSION@</H1>
+
+<P>CUPS ist das auf Standards basierte, Open-Source Drucker System, welches von
+<A HREF="http://www.apple.com/">Apple Inc.</A> für Mac OS<SUP>®</SUP> X und
+andere UNIX<SUP>®</SUP>-ähnliche Betriebssysteme entwickelt wird.</P>
+
+</TD>
+<TD><A HREF="http://www.cups.org/"><IMG SRC="images/cups-icon.png" WIDTH="128"
+HEIGHT="128" ALT="CUPS"></A></TD>
+</TR>
+</TABLE>
+
+<TABLE CLASS="indent" SUMMARY="">
+<TR><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-right: 20px;">
+
+<H2>CUPS für Benutzer</H2>
+
+<P><A HREF="help/overview.html">CUPS Übersicht</A></P>
+
+<P><A HREF="help/options.html">Kommandozeilendruck und Einstellungen</A></P>
+
+<P><A HREF="help/whatsnew.html">Neues in CUPS 1.4</A></P>
+
+<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Benutzer Forum</A></P>
+
+</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
+
+<H2>CUPS für Administratoren</H2>
+
+<P><A HREF="admin">Drucker und Klassen hinzufügen</A></P>
+
+<P><A HREF="help/policies.html">Betriebsrichtlinien verwalten</A></P>
+
+<P><A HREF="help/accounting.html">Basiswissen Druckabrechnung</A></P>
+
+<P><A HREF="help/security.html">Sicherheit des Servers</A></P>
+
+<P><A HREF="help/kerberos.html">Benutzen der Kerberos Authentifizierung</A></P>
+
+<P><A HREF="help/network.html">Benutzen von Netzwerkdruckern</A></P>
+
+<P><A HREF="help/ref-cupsd-conf.html">cupsd.conf Referenz</A></P>
+
+<P><A HREF="http://www.cups.org/ppd.php">Druckertreiber finden</A></P>
+
+</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
+
+<H2>CUPS für Entwickler</H2>
+
+<P><A HREF="help/api-overview.html">Einführung in die CUPS Programmierung</A></P>
+
+<P><A HREF="help/api-cups.html">CUPS API</A></P>
+
+<P><A HREF="help/api-filter.html">Filter und Backend Programmierung</A></P>
+
+<P><A HREF="help/api-httpipp.html">HTTP und IPP APIs</A></P>
+
+<P><A HREF="help/api-ppd.html">PPD API</A></P>
+
+<P><A HREF="help/api-raster.html">Raster API</A></P>
+
+<P><A HREF="help/ref-ppdcfile.html">PPD Compiler Driver Information File Reference</A></P>
+
+<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Entwickler Forum</A></P>
+
+</TD></TR>
+</TABLE>
+
+</TD></TR>
+<TR><TD> </TD></TR>
+<TR><TD CLASS="trailer">CUPS und das CUPS Logo sind
+eingetragene Warenzeichen der <A HREF="http://www.apple.com">Apple Inc.</A>
+CUPS ist urheberrechtlich geschützt 2007-2009 von Apple Inc, alle Rechte vorbehalten.</TD></TR>
+</TABLE>
+</BODY>
+</HTML>
name for the printer. If the printer is not being shared using this protocol,
printer-dns-sd-name will have the noValue value.</p>
+<h4><a name="printer-state-reasons">printer-state-reasons (1setOf type2 keyword)</a></h4>
+
+<p>The printer-state-reasons attribute provides additional persistent state
+information for a printer. In addition to the keywords defined in RFC 2911,
+CUPS supports vendor-specific keywords with a domain prefix ("com.vendor.foo")
+and the following CUPS-specific keywords:</p>
+
+<ul>
+
+ <li><tt>cups-insecure-filter-warning</tt> - a filter or backend (or the
+ directory containing the filter or backend) has insecure file
+ permissions. CUPS will not execute programs with world write permissions
+ or setuid programs. When run as root (the default), CUPS also does not
+ execute programs that are not owned by root.
+ <span class='info'>CUPS 1.4</span></li>
+
+ <li><tt>cups-missing-filter-warning</tt> - a filter or backend is not
+ installed. <span class='info'>CUPS 1.4</span></li>
+
+</ul>
+
<h4><a name="printer-type">printer-type (type2 enum)</a></h4>
<p>The printer-type attribute specifies printer type and
# DO NOT DELETE
-ppdc-array.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-array.o: ../cups/versioning.h
-ppdc-attr.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-attr.o: ../cups/versioning.h
-ppdc-catalog.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-catalog.o: ../cups/versioning.h ../cups/globals.h ../cups/string.h
-ppdc-catalog.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
-ppdc-catalog.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
-ppdc-catalog.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-array.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-array.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-array.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-array.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-array.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+ppdc-array.o: ../cups/i18n.h ../cups/transcode.h
+ppdc-attr.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-attr.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-attr.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-attr.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdc-attr.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdc-attr.o: ../cups/transcode.h
+ppdc-catalog.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-catalog.o: ../cups/debug.h ../cups/globals.h ../cups/string.h
+ppdc-catalog.o: ../config.h ../cups/http-private.h ../cups/http.h
+ppdc-catalog.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h
+ppdc-catalog.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h
ppdc-catalog.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
-ppdc-choice.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-choice.o: ../cups/versioning.h
-ppdc-constraint.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-constraint.o: ../cups/versioning.h
-ppdc-driver.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-driver.o: ../cups/versioning.h ../cups/globals.h ../cups/string.h
+ppdc-choice.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-choice.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-choice.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-choice.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-choice.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-choice.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-constraint.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-constraint.o: ../cups/debug.h ../cups/globals.h ../cups/string.h
+ppdc-constraint.o: ../config.h ../cups/http-private.h ../cups/http.h
+ppdc-constraint.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h
+ppdc-constraint.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h
+ppdc-constraint.o: ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdc-constraint.o: ../cups/transcode.h
+ppdc-driver.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-driver.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
ppdc-driver.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
ppdc-driver.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
ppdc-driver.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
ppdc-driver.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
-ppdc-file.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-file.o: ../cups/versioning.h ../cups/i18n.h ../cups/transcode.h
-ppdc-file.o: ../cups/language.h ../cups/array.h
-ppdc-filter.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-filter.o: ../cups/versioning.h
-ppdc-font.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-font.o: ../cups/versioning.h
-ppdc-group.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-group.o: ../cups/versioning.h
-ppdc-import.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-import.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h
-ppdc-import.o: ../cups/file.h ../cups/i18n.h ../cups/transcode.h
-ppdc-import.o: ../cups/language.h
-ppdc-mediasize.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-mediasize.o: ../cups/versioning.h
-ppdc-message.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-message.o: ../cups/versioning.h
-ppdc-option.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-option.o: ../cups/versioning.h
-ppdc-profile.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-profile.o: ../cups/versioning.h
-ppdc-shared.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-shared.o: ../cups/versioning.h
-ppdc-source.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-source.o: ../cups/versioning.h ../cups/globals.h ../cups/string.h
+ppdc-file.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-file.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-file.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-file.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdc-file.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdc-file.o: ../cups/transcode.h ../cups/i18n.h
+ppdc-filter.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-filter.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-filter.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-filter.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-filter.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-filter.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-font.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-font.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-font.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-font.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdc-font.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdc-font.o: ../cups/transcode.h
+ppdc-group.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-group.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-group.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-group.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-group.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+ppdc-group.o: ../cups/i18n.h ../cups/transcode.h
+ppdc-import.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-import.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-import.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-import.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-import.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-import.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-import.o: ../cups/ppd.h ../cups/i18n.h
+ppdc-mediasize.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-mediasize.o: ../cups/debug.h ../cups/globals.h ../cups/string.h
+ppdc-mediasize.o: ../config.h ../cups/http-private.h ../cups/http.h
+ppdc-mediasize.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h
+ppdc-mediasize.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-mediasize.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-message.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-message.o: ../cups/debug.h ../cups/globals.h ../cups/string.h
+ppdc-message.o: ../config.h ../cups/http-private.h ../cups/http.h
+ppdc-message.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h
+ppdc-message.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-message.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-option.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-option.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-option.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-option.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-option.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-option.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-profile.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-profile.o: ../cups/debug.h ../cups/globals.h ../cups/string.h
+ppdc-profile.o: ../config.h ../cups/http-private.h ../cups/http.h
+ppdc-profile.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h
+ppdc-profile.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-profile.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-shared.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-shared.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-shared.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-shared.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-shared.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-shared.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-source.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-source.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
ppdc-source.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
ppdc-source.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
ppdc-source.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
ppdc-source.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
ppdc-source.o: ../cups/raster.h ../cups/cups.h ../data/epson.h ../data/escp.h
ppdc-source.o: ../data/hp.h ../data/label.h ../data/pcl.h
-ppdc-string.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-string.o: ../cups/versioning.h
-ppdc-variable.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc-variable.o: ../cups/versioning.h
-genstrings.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-genstrings.o: ../cups/versioning.h
-ppdc.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdc.o: ../cups/versioning.h ../cups/i18n.h ../cups/transcode.h
-ppdc.o: ../cups/language.h ../cups/array.h
-ppdhtml.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdhtml.o: ../cups/versioning.h ../cups/i18n.h ../cups/transcode.h
-ppdhtml.o: ../cups/language.h ../cups/array.h
-ppdi.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdi.o: ../cups/versioning.h ../cups/i18n.h ../cups/transcode.h
-ppdi.o: ../cups/language.h ../cups/array.h
+ppdc-string.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-string.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc-string.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc-string.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+ppdc-string.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-string.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+ppdc-variable.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc-variable.o: ../cups/debug.h ../cups/globals.h ../cups/string.h
+ppdc-variable.o: ../config.h ../cups/http-private.h ../cups/http.h
+ppdc-variable.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h
+ppdc-variable.o: ../cups/cups.h ../cups/ppd.h ../cups/array.h ../cups/file.h
+ppdc-variable.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
+genstrings.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+genstrings.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+genstrings.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+genstrings.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+genstrings.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+genstrings.o: ../cups/i18n.h ../cups/transcode.h
+ppdc.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdc.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdc.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdc.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdc.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdc.o: ../cups/transcode.h
+ppdhtml.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdhtml.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdhtml.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdhtml.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdhtml.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdhtml.o: ../cups/transcode.h
+ppdi.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdi.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdi.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdi.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdi.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdi.o: ../cups/transcode.h
ppdmerge.o: ../cups/ppd-private.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
-ppdmerge.o: ../cups/versioning.h ../cups/string.h ../cups/ppd.h
+ppdmerge.o: ../cups/versioning.h ../cups/string.h ../config.h ../cups/ppd.h
ppdmerge.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/cups.h
-ppdmerge.o: ../cups/array.h ../cups/string.h ../config.h ../cups/i18n.h
-ppdmerge.o: ../cups/transcode.h
-ppdpo.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-ppdpo.o: ../cups/versioning.h ../cups/i18n.h ../cups/transcode.h
-ppdpo.o: ../cups/language.h ../cups/array.h
-testcatalog.o: ppdc.h ../cups/string.h ../config.h ../cups/file.h
-testcatalog.o: ../cups/versioning.h
+ppdmerge.o: ../cups/array.h ../cups/string.h ../cups/i18n.h
+ppdpo.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+ppdpo.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+ppdpo.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+ppdpo.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h ../cups/ppd.h
+ppdpo.o: ../cups/array.h ../cups/file.h ../cups/language.h ../cups/i18n.h
+ppdpo.o: ../cups/transcode.h
+testcatalog.o: ppdc-private.h ppdc.h ../cups/file.h ../cups/versioning.h
+testcatalog.o: ../cups/debug.h ../cups/globals.h ../cups/string.h ../config.h
+testcatalog.o: ../cups/http-private.h ../cups/http.h ../cups/md5.h
+testcatalog.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+testcatalog.o: ../cups/ppd.h ../cups/array.h ../cups/file.h
+testcatalog.o: ../cups/language.h ../cups/i18n.h ../cups/transcode.h
# libcupsppdc.so.1, libcupsppdc.sl.1
#
-libcupsppdc.so.1 libcupsppdc.sl.1: $(LIBOBJS)
+libcupsppdc.so.1 libcupsppdc.sl.1: $(LIBOBJS) ../cups/$(LIBCUPS)
echo Linking $@...
- $(DSOXX) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS)
+ $(DSOXX) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LINKCUPS)
$(RM) `basename $@ .1`
$(LN) $@ `basename $@ .1`
# libcupsppdc.1.dylib
#
-libcupsppdc.1.dylib: $(LIBOBJS)
+libcupsppdc.1.dylib: $(LIBOBJS) ../cups/$(LIBCUPS)
echo Creating export list for $@...
nm $(LIBOBJS) | grep "T __" | awk '{print $$3}' | sort >t.exp
echo Linking $@...
-current_version 1.0.0 \
-compatibility_version 1.0.0 \
-exported_symbols_list t.exp \
- $(LIBOBJS) $(LIBS)
+ $(LIBOBJS) $(LINKCUPS)
$(RM) libcupsppdc.dylib t.exp
$(LN) $@ libcupsppdc.dylib
# libcupsppdc_s.a
#
-libcupsppdc_s.a: $(LIBOBJS)
+libcupsppdc_s.a: $(LIBOBJS) ../cups/$(LIBCUPS)
echo Creating $@...
- $(DSOXX) $(DSOFLAGS) -o libcupsppdc_s.o $(LIBOBJS) $(LIBS)
+ $(DSOXX) $(DSOFLAGS) -o libcupsppdc_s.o $(LIBOBJS) $(LINKCUPS)
$(RM) $@
$(AR) $(ARFLAGS) $@ libcupsppdc_s.o
# libcupsppdc.la
#
-libcupsppdc.la: $(LIBOBJS)
+libcupsppdc.la: $(LIBOBJS) ../cups/$(LIBCUPS)
echo Linking $@...
$(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \
- -version-info 1:0 $(LIBS)
+ -version-info 1:0 $(LINKCUPS)
#
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <unistd.h>
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
-#include <cups/globals.h>
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <cups/globals.h>
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <cups/i18n.h>
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <cups/ppd.h>
#include <cups/i18n.h>
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
--- /dev/null
+//
+// "$Id$"
+//
+// Private definitions for the CUPS PPD Compiler.
+//
+// Copyright 2009 by Apple Inc.
+//
+// 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"
+// which should have been included with this file. If this file is
+// file is missing or damaged, see the license at "http://www.cups.org/".
+//
+
+#ifndef _PPDC_PRIVATE_H_
+# define _PPDC_PRIVATE_H_
+
+//
+// Include necessary headers...
+//
+
+# include "ppdc.h"
+# include <cups/debug.h>
+# include <cups/globals.h>
+# include <errno.h>
+
+
+//
+// Macros...
+//
+
+# define PPDC_NEW DEBUG_printf(("%s: %p new", class_name(), this))
+# define PPDC_NEWVAL(s) DEBUG_printf(("%s(\"%s\"): %p new", class_name(), s, this))
+# define PPDC_DELETE DEBUG_printf(("%s: %p delete", class_name(), this))
+
+
+#endif // !_PPDC_PRIVATE_H_
+
+//
+// End of "$Id$".
+//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
void
ppdcShared::release(void)
{
-#ifdef DEBUG
- fprintf(stderr, "DEBUG: %p release %s use=%d\n", this, class_name(), use);
-#endif // DEBUG
+ DEBUG_printf(("%s: %p release use=%d", class_name(), this, use));
use --;
if (!use)
{
use ++;
-#ifdef DEBUG
- fprintf(stderr, "DEBUG: %p retain %s use=%d\n", this, class_name(), use);
-#endif // DEBUG
+ DEBUG_printf(("%s: %p retain use=%d", class_name(), this, use));
}
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <cups/globals.h>
#include <limits.h>
#include <math.h>
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
-#include <cups/i18n.h>
//
//
// Definitions for the CUPS PPD Compiler.
//
-// Copyright 2007-2008 by Apple Inc.
+// Copyright 2007-2009 by Apple Inc.
// Copyright 2002-2007 by Easy Software Products.
//
// These coded instructions, statements, and computer programs are the
// Include necessary headers...
//
-# include <cups/string.h>
-
# include <cups/file.h>
# include <stdlib.h>
-# include <errno.h>
//
// Macros...
//
-# ifdef DEBUG
-# define PPDC_NAME(s) const char *class_name() { return (s); }
-# define PPDC_NEW fprintf(stderr, "DEBUG: %p new %s\n", this, class_name())
-# define PPDC_NEWVAL(s) fprintf(stderr, "DEBUG: %p new %s(\"%s\")\n", this, class_name(), s)
-# define PPDC_DELETE fprintf(stderr, "DEBUG: %p delete %s\n", this, class_name())
-# else
-# define PPDC_NAME(s)
-# define PPDC_NEW
-# define PPDC_NEWVAL(s)
-# define PPDC_DELETE
-# endif // DEBUG
+# define PPDC_NAME(s) const char *class_name() { return (s); }
//
ppdcShared();
virtual ~ppdcShared();
-# ifdef DEBUG
virtual const char *class_name() = 0;
-# endif // DEBUG
void retain();
void release();
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <sys/stat.h>
#include <sys/types.h>
-#include <cups/i18n.h>
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
-#include <cups/i18n.h>
//
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
#include <sys/stat.h>
#include <sys/types.h>
-#include <cups/i18n.h>
//
{
Manufacturer "Dymo"
ModelName "Label Printer"
+ Attribute NickName "" "Dymo Label Printer"
PCFileName "dymo.ppd"
DriverType label
ModelNumber $DYMO_3x0
// Epson 24-Pin Series
{
ModelName "24-Pin Series"
+ Attribute NickName "" "Epson 24-Pin Series"
PCFileName "epson24.ppd"
ModelNumber $EPSON_24PIN
// Epson 9-Pin Series
{
ModelName "9-Pin Series"
+ Attribute NickName "" "Epson 9-Pin Series"
PCFileName "epson9.ppd"
ModelNumber $EPSON_9PIN
ColorDevice No
// Epson Stylus Color Series
{
ModelName "Stylus Color Series"
+ Attribute NickName "" "Epson Stylus Color Series"
PCFileName "stcolor.ppd"
ModelNumber $EPSON_COLOR
ColorDevice Yes
// Epson New Stylus Color Series
{
ModelName "New Stylus Color Series"
+ Attribute NickName "" "Epson New Stylus Color Series"
PCFileName "stcolor2.ppd"
ModelNumber $EPSON_ICOLOR
ColorDevice Yes
// Epson Stylus Color Series
{
ModelName "Stylus Photo Series"
+ Attribute NickName "" "Epson Stylus Photo Series"
PCFileName "stphoto.ppd"
ModelNumber $EPSON_PHOTO
ColorDevice Yes
// Epson New Stylus Color Series
{
ModelName "New Stylus Photo Series"
+ Attribute NickName "" "Epson New Stylus Photo Series"
PCFileName "stphoto2.ppd"
ModelNumber $EPSON_IPHOTO
ColorDevice Yes
DriverType hp
ModelName "PCL Laser Printer"
+ Attribute NickName "" "Generic PCL Laser Printer"
PCFileName "generpcl.ppd"
Throughput 8
ModelNumber $HP_LASERJET
DriverType ps
ModelName "PostScript Printer"
+ Attribute NickName "" "Generic PostScript Printer"
PCFileName "generic.ppd"
Throughput 8
ColorDevice No
// HP DeskJet Series
{
ModelName "DeskJet Series"
+ Attribute NickName "" "HP DeskJet Series"
PCFileName "deskjet.ppd"
ModelNumber $HP_DESKJET
ManualCopies Yes
// HP LaserJet Series PCL 4/5
{
ModelName "LaserJet Series PCL 4/5"
+ Attribute NickName "" "HP LaserJet Series PCL 4/5"
PCFileName "laserjet.ppd"
Throughput 8
ModelNumber $HP_LASERJET
{
Manufacturer "Intellitech"
ModelName "IntelliBar Label Printer"
- Attribute ShortNickName "" "Intellibar Label Printer"
+ Attribute ShortNickName "" "IntelliBar Label Printer"
PCFileName "intelbar.ppd"
DriverType label
ModelNumber $INTELLITECH_PCL
// Oki 24-Pin Series
{
ModelName "24-Pin Series"
+ Attribute NickName "" "Oki 24-Pin Series"
PCFileName "okidat24.ppd"
ModelNumber $EPSON_24PIN
// Oki 9-Pin Series
{
ModelName "9-Pin Series"
+ Attribute NickName "" "Oki 9-Pin Series"
PCFileName "okidata9.ppd"
ModelNumber $EPSON_9PIN
ColorDevice No
// Zebra CPCL Label Printer
{
ModelName "CPCL Label Printer"
+ Attribute NickName "" "Zebra CPCL Label Printer"
PCFileName "zebracpl.ppd"
ModelNumber $ZEBRA_CPCL
// Zebra EPL1 Label Printer
{
ModelName "EPL1 Label Printer"
+ Attribute NickName "" "Zebra EPL1 Label Printer"
PCFileName "zebraep1.ppd"
ModelNumber $ZEBRA_EPL_LINE
// Zebra EPL2 Label Printer
{
ModelName "EPL2 Label Printer"
+ Attribute NickName "" "Zebra EPL2 Label Printer"
PCFileName "zebraep2.ppd"
ModelNumber $ZEBRA_EPL_PAGE
// Zebra ZPL Label Printer
{
ModelName "ZPL Label Printer"
+ Attribute NickName "" "Zebra ZPL Label Printer"
PCFileName "zebra.ppd"
ModelNumber $ZEBRA_ZPL
// Include necessary headers...
//
-#include "ppdc.h"
+#include "ppdc-private.h"
//
if (bytes <= 0 ||
(con->http.state != HTTP_GET_SEND && con->http.state != HTTP_POST_SEND))
{
- if (!con->sent_header && !con->response)
+ if (!con->sent_header && con->pipe_pid)
cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE);
else
{
envp[envc++] = home;
envp[envc] = NULL;
- if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL, 0,
- &pid))
+ if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL,
+ NULL, &pid))
{
unlink(seedfile);
return (0);
infofd = open(infofile, O_RDONLY);
if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
- 0, &pid))
+ NULL, &pid))
{
close(infofd);
unlink(infofile);
infofd = open(infofile, O_RDONLY);
if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
- 0, &pid))
+ NULL, &pid))
{
close(infofd);
unlink(infofile);
{
# if !defined(HAVE_KRB5_CC_NEW_UNIQUE) && !defined(HAVE_HEIMDAL)
cupsdLogMessage(CUPSD_LOG_INFO,
- "Sorry, your version of Kerberos does not support "
+ "[CGI] Sorry, your version of Kerberos does not support "
"delegated credentials!");
# else
KerberosContext = NULL;
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to initialize Kerberos context");
+ "[CGI] Unable to initialize Kerberos context");
}
}
# endif /* HAVE_KRB5_CC_NEW_UNIQUE */
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create new credentials cache (%d/%s)",
+ "[CGI] Unable to create new credentials cache (%d/%s)",
error, strerror(errno));
ccache = NULL;
}
&principal)) != 0)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to parse kerberos username (%d/%s)", error,
- strerror(errno));
+ "[CGI] Unable to parse kerberos username (%d/%s)",
+ error, strerror(errno));
krb5_cc_destroy(KerberosContext, ccache);
ccache = NULL;
}
principal)))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to initialize credentials cache (%d/%s)",
+ "[CGI] Unable to initialize credentials cache (%d/%s)",
error, strerror(errno));
krb5_cc_destroy(KerberosContext, ccache);
krb5_free_principal(KerberosContext, principal);
if (GSS_ERROR(major_status))
{
cupsdLogGSSMessage(CUPSD_LOG_ERROR, major_status, minor_status,
- "Unable to import client credentials cache");
+ "[CGI] Unable to import client credentials "
+ "cache");
krb5_cc_destroy(KerberosContext, ccache);
ccache = NULL;
}
envp[envc] = NULL;
- if (LogLevel == CUPSD_LOG_DEBUG2)
+ if (LogLevel >= CUPSD_LOG_DEBUG)
{
for (i = 0; i < argc; i ++)
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "pipe_command: argv[%d] = \"%s\"", i, argv[i]);
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "[CGI] argv[%d] = \"%s\"", i, argv[i]);
for (i = 0; i < envc; i ++)
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "pipe_command: envp[%d] = \"%s\"", i, envp[i]);
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "[CGI] envp[%d] = \"%s\"", i, envp[i]);
}
/*
if (cupsdOpenPipe(fds))
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create pipes for CGI %s - %s",
+ cupsdLogMessage(CUPSD_LOG_ERROR, "[CGI] Unable to create pipe for %s - %s",
argv[0], strerror(errno));
return (0);
}
*/
if (cupsdStartProcess(command, argv, envp, infile, fds[1], CGIPipes[1],
- -1, -1, root, DefaultProfile, 0, &pid) < 0)
+ -1, -1, root, DefaultProfile, NULL, &pid) < 0)
{
/*
* Error - can't fork!
*/
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to fork for CGI %s - %s", argv[0],
+ cupsdLogMessage(CUPSD_LOG_ERROR, "[CGI] Unable to start %s - %s", argv[0],
strerror(errno));
cupsdClosePipe(fds);
cupsdAddCert(pid, con->username, NULL);
#endif /* HAVE_GSSAPI */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[CGI] %s started - PID = %d",
- command, pid);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[CGI] Started %s (PID %d)", command, pid);
*outfile = fds[0];
close(fds[1]);
extern int cupsdStartProcess(const char *command, char *argv[],
char *envp[], int infd, int outfd,
int errfd, int backfd, int sidefd,
- int root, void *profile, int job_id,
+ int root, void *profile, cupsd_job_t *job,
int *pid);
extern int cupsdAddSelect(int fd, cupsd_selfunc_t read_cb,
argv[1] = pollp->hostname;
if (cupsdStartProcess(polld, argv, envp, -1, -1, statusfds[1], -1, -1,
- 0, DefaultProfile, 0, &(pollp->pid)) < 0)
+ 0, DefaultProfile, NULL, &(pollp->pid)) < 0)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdStartPolling: Unable to fork polling daemon - %s",
DNSServiceErrorType error; /* Error from service creation */
char webif[1024]; /* Web interface share name */
#ifdef HAVE_COREFOUNDATION_H
+ SCDynamicStoreRef sc; /* Context for dynamic store */
CFStringRef nameRef; /* Computer name CFString */
char nameBuffer[1024]; /* C-string buffer */
CFStringEncoding nameEncoding; /* Computer name encoding */
*/
#ifdef HAVE_COREFOUNDATION_H
- cupsdClearString(&DNSSDName);
+ sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), NULL, NULL);
- if ((nameRef = SCDynamicStoreCopyComputerName(NULL,
- &nameEncoding)) != NULL)
+ if (sc)
{
- if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
- kCFStringEncodingUTF8))
- cupsdSetString(&DNSSDName, nameBuffer);
+ if ((nameRef = SCDynamicStoreCopyComputerName(sc,
+ &nameEncoding)) != NULL)
+ {
+ if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer),
+ kCFStringEncodingUTF8))
+ cupsdSetString(&DNSSDName, nameBuffer);
- CFRelease(nameRef);
- }
+ CFRelease(nameRef);
+ }
+ else
+ cupsdSetString(&DNSSDName, ServerName);
-#else
- cupsdSetString(&DNSSDName, ServerName);
+ CFRelease(sc);
+ }
+ else
#endif /* HAVE_COREFOUNDATION_H */
+ cupsdSetString(&DNSSDName, ServerName);
/*
* Then (re)register the web interface if enabled...
*nameptr; /* Pointer into name */
int ipp_len, /* IPP TXT record length */
printer_len; /* LPD TXT record length */
- char resource[1024]; /* Resource path for printer */
const char *regtype; /* Registration type */
- const char *domain; /* Registration domain */
- cupsd_location_t *location, /* Printer location */
- *policy; /* Operation policy for Print-Job */
- unsigned address[4]; /* INADDR_ANY address */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name,
cupsArrayAdd(DNSSDPrinters, p);
}
- /*
- * If 'Allow printing from the Internet' is enabled (i.e. from any address)
- * let dnssd decide on the domain, otherwise restrict it to ".local".
- */
-
- if (p->type & CUPS_PRINTER_CLASS)
- snprintf(resource, sizeof(resource), "/classes/%s", p->name);
- else
- snprintf(resource, sizeof(resource), "/printers/%s", p->name);
-
- address[0] = address[1] = address[2] = address[3] = 0;
- location = cupsdFindBest(resource, HTTP_POST);
- policy = cupsdFindPolicyOp(p->op_policy_ptr, IPP_PRINT_JOB);
-
- if ((location && !cupsdCheckAccess(address, "", 0, location)) ||
- (policy && !cupsdCheckAccess(address, "", 0, policy)))
- domain = "local.";
- else
- domain = NULL;
-
/*
* Register IPP and (optionally) LPD...
*/
"_ipp._tcp,_cups";
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Registering DNS-SD printer %s with name \"%s\", "
- "type \"%s\", and domain \"%s\"", p->name, name, regtype,
- domain ? domain : "(null)");
+ "Registering DNS-SD printer %s with name \"%s\" and "
+ "type \"%s\"", p->name, name, regtype);
/*
* Register the queue, dropping characters as needed until we succeed...
{
p->ipp_ref = DNSSDRef;
if ((se = DNSServiceRegister(&p->ipp_ref, kDNSServiceFlagsShareConnection,
- 0, name, regtype, domain, NULL,
+ 0, name, regtype, NULL, NULL,
htons(DNSSDPort), ipp_len, ipp_txt,
dnssdRegisterCallback,
p)) == kDNSServiceErr_BadParam)
*/
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Registering DNS-SD printer %s with name \"%s\", "
- "type \"_printer._tcp\", and domain \"%s\"", p->name,
- name, domain ? domain : "(null)");
+ "Registering DNS-SD printer %s with name \"%s\" and "
+ "type \"_printer._tcp\"", p->name, name);
p->printer_ref = DNSSDRef;
if ((se = DNSServiceRegister(&p->printer_ref,
kDNSServiceFlagsShareConnection,
- 0, name, "_printer._tcp", domain, NULL,
+ 0, name, "_printer._tcp", NULL, NULL,
htons(515), printer_len, printer_txt,
dnssdRegisterCallback,
p)) == kDNSServiceErr_NoError)
argv[4] = NULL;
cupsdStartProcess("/bin/launchctl", argv, envp, -1, -1, -1, -1, -1, 1,
- NULL, 0, &pid);
+ NULL, NULL, &pid);
}
#endif /* __APPLE__ */
else
"copy_model: Running \"cups-driverd cat %s\"...", from);
if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1],
- -1, -1, 0, DefaultProfile, 0, &temppid))
+ -1, -1, 0, DefaultProfile, NULL, &temppid))
{
close(tempfd);
unlink(tempfile);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[0], job->side_pipes[0], 0,
- job->profile, job->id, job->filters + i);
+ job->profile, job, job->filters + i);
cupsdClosePipe(filterfds[!slot]);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[1], job->side_pipes[1],
- backroot, job->profile, job->id, &(job->backend));
+ backroot, job->profile, job, &(job->backend));
if (pid == 0)
{
cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.",
job->id);
+ /*
+ * If we get here than we are able to run the printer driver filters, so clear
+ * the missing and insecure warnings...
+ */
+
+ cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning,"
+ "cups-insecure-filter-warning");
+
return;
job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL);
job->status_level = CUPSD_LOG_INFO;
+ if (job->printer_message)
+ cupsdSetString(&(job->printer_message->values[0].string.text), "");
+
/*
* Create the backchannel pipes and make them non-blocking...
*/
if (value &&
strcmp(value, "com.apple.print.recoverable-warning") &&
strcmp(value, "connecting-to-device") &&
- strcmp(value, "cups-insecure-filter-error") &&
- strcmp(value, "cups-missing-filter-error"))
+ strcmp(value, "cups-insecure-filter-warning") &&
+ strcmp(value, "cups-missing-filter-warning"))
{
for (i = 0 ; i < p->num_reasons; i ++)
if (!strcmp(value, p->reasons[i]))
for (i = 0; i < printer->num_reasons; i ++)
if (strcmp(printer->reasons[i], "com.apple.print.recoverable-warning") &&
strcmp(printer->reasons[i], "connecting-to-device") &&
- strcmp(printer->reasons[i], "cups-insecure-filter-error") &&
- strcmp(printer->reasons[i], "cups-missing-filter-error"))
+ strcmp(printer->reasons[i], "cups-insecure-filter-warning") &&
+ strcmp(printer->reasons[i], "cups-missing-filter-warning"))
cupsFilePutConf(fp, "Reason", printer->reasons[i]);
cupsFilePrintf(fp, "Type %d\n", printer->type);
* Add filters for printer...
*/
- cupsdSetPrinterReasons(p, "-cups-missing-filter-error");
+ cupsdSetPrinterReasons(p, "-cups-missing-filter-warning,"
+ "cups-insecure-filter-warning");
for (filter = (char *)cupsArrayFirst(p->filters);
filter;
snprintf(p->state_message, sizeof(p->state_message),
"Filter \"%s\" for printer \"%s\" not available: %s",
filename, p->name, strerror(errno));
- cupsdSetPrinterReasons(p, "+cups-missing-filter-error");
+ cupsdSetPrinterReasons(p, "+cups-missing-filter-warning");
cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
- return;
}
+ else
+ memset(&fileinfo, 0, sizeof(fileinfo));
/*
* When running as root, do additional security checks...
* permissions.
*/
- if (fileinfo.st_uid || (fileinfo.st_mode & S_IWOTH) != 0)
+ if (fileinfo.st_uid || (fileinfo.st_mode & (S_ISUID | S_IWOTH)) != 0)
{
if (fileinfo.st_uid)
snprintf(p->state_message, sizeof(p->state_message),
"Filter \"%s\" for printer \"%s\" has insecure permissions "
"(0%o)", filename, p->name, fileinfo.st_mode);
- cupsdSetPrinterReasons(p, "+cups-insecure-filter-error");
+ cupsdSetPrinterReasons(p, "+cups-insecure-filter-warning");
cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
- return;
}
-
- /*
- * Similarly, check that the parent directory is also owned by root and
- * does not have world write permissions.
- */
-
- if ((dirsep = strrchr(filename, '/')) != NULL)
- *dirsep = '\0';
-
- if (stat(filename, &fileinfo))
+ else if (fileinfo.st_mode)
{
- snprintf(p->state_message, sizeof(p->state_message),
- "Filter directory \"%s\" for printer \"%s\" not accessible: %s",
- filename, p->name, strerror(errno));
- cupsdSetPrinterReasons(p, "+cups-missing-filter-error");
+ /*
+ * Similarly, check that the parent directory is also owned by root and
+ * does not have world write permissions.
+ */
- cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
- return;
- }
- else if (fileinfo.st_uid || (fileinfo.st_mode & S_IWOTH) != 0)
- {
- if (fileinfo.st_uid)
- snprintf(p->state_message, sizeof(p->state_message),
- "Filter directory \"%s\" for printer \"%s\" not owned by "
- "root", filename, p->name);
- else
- snprintf(p->state_message, sizeof(p->state_message),
- "Filter directory \"%s\" for printer \"%s\" has insecure "
- "permissions (0%o)", filename, p->name, fileinfo.st_mode);
+ if ((dirsep = strrchr(filename, '/')) != NULL)
+ *dirsep = '\0';
- cupsdSetPrinterReasons(p, "+cups-insecure-filter-error");
+ if (!stat(filename, &fileinfo) &&
+ (fileinfo.st_uid ||
+ (fileinfo.st_mode & (S_ISUID | S_IWOTH)) != 0))
+ {
+ if (fileinfo.st_uid)
+ snprintf(p->state_message, sizeof(p->state_message),
+ "Filter directory \"%s\" for printer \"%s\" not owned by "
+ "root", filename, p->name);
+ else
+ snprintf(p->state_message, sizeof(p->state_message),
+ "Filter directory \"%s\" for printer \"%s\" has insecure "
+ "permissions (0%o)", filename, p->name, fileinfo.st_mode);
- cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
- return;
+ cupsdSetPrinterReasons(p, "+cups-insecure-filter-warning");
+
+ cupsdLogMessage(CUPSD_LOG_ERROR, "%s", p->state_message);
+ }
}
}
}
mimeDeleteFilter(MimeDatabase, filter);
}
- cupsdSetPrinterReasons(p, "-cups-insecure-filter-error"
- ",cups-missing-filter-error");
+ cupsdSetPrinterReasons(p, "-cups-insecure-filter-warning"
+ ",cups-missing-filter-warning");
}
int sidefd, /* I - Sidechannel file descriptor */
int root, /* I - Run as root? */
void *profile, /* I - Security profile to use */
- int job_id, /* I - Job associated with process */
+ cupsd_job_t *job, /* I - Job associated with process */
int *pid) /* O - Process ID */
{
int user; /* Command UID */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, "
"infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, "
- "profile=%p, job_id=%d, pid=%p) = %d",
+ "profile=%p, job=%p(%d), pid=%p) = %d",
command, argv, envp, infd, outfd, errfd, backfd, sidefd,
- root, profile, job_id, pid, *pid);
+ root, profile, job, job ? job->id : 0, pid, *pid);
cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to execute %s: %s", command,
strerror(errno));
+
+ if (job && job->printer)
+ cupsdSetPrinterReasons(job->printer, "+cups-missing-filter-warning");
+
return (0);
}
- else if (commandinfo.st_mode & S_IWOTH)
+ else if (commandinfo.st_mode & (S_ISUID | S_IWOTH))
{
*pid = 0;
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, "
"infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, "
- "profile=%p, job_id=%d, pid=%p) = %d",
+ "profile=%p, job=%p(%d), pid=%p) = %d",
command, argv, envp, infd, outfd, errfd, backfd, sidefd,
- root, profile, job_id, pid, *pid);
+ root, profile, job, job ? job->id : 0, pid, *pid);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to execute %s: insecure file permissions (0%o)",
command, commandinfo.st_mode);
+ if (job && job->printer)
+ cupsdSetPrinterReasons(job->printer, "+cups-insecure-filter-warning");
+
errno = EPERM;
+
return (0);
}
else if ((commandinfo.st_uid != user || !(commandinfo.st_mode & S_IXUSR)) &&
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, "
"infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, "
- "profile=%p, job_id=%d, pid=%p) = %d",
+ "profile=%p, job=%p(%d), pid=%p) = %d",
command, argv, envp, infd, outfd, errfd, backfd, sidefd,
- root, profile, job_id, pid, *pid);
+ root, profile, job, job ? job->id : 0, pid, *pid);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to execute %s: no execute permissions (0%o)",
command, commandinfo.st_mode);
if ((proc = calloc(1, sizeof(cupsd_proc_t) + strlen(command))) != NULL)
{
proc->pid = *pid;
- proc->job_id = job_id;
+ proc->job_id = job ? job->id : 0;
strcpy(proc->name, command);
cupsArrayAdd(process_array, proc);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, "
"infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, "
- "profile=%p, job_id=%d, pid=%p) = %d",
+ "profile=%p, job=%p(%d), pid=%p) = %d",
command, argv, envp, infd, outfd, errfd, backfd, sidefd,
- root, profile, job_id, pid, *pid);
+ root, profile, job, job ? job->id : 0, pid, *pid);
return (*pid);
}
*/
if (cupsdStartProcess(command, argv, envp, fds[0], -1, NotifierPipes[1],
- -1, -1, 0, DefaultProfile, 0, &pid) < 0)
+ -1, -1, 0, DefaultProfile, NULL, &pid) < 0)
{
/*
* Error - can't fork!
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">>Klasse hinzufügen</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<TABLE>
+<TR>
+<TH CLASS="label">Name:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Darf alle druckbaren Zeichen außer "/", "#", und Leerzeichen enthalten)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beschreibung:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Ort:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Für Menschen lesbarer Ort wie "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Mitglieder:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Klasse hinzufügen"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Drucker hinzufügen</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{?current_make!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE" VALUE="{current_make}">:}
+{?current_make_and_model!?<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{current_make_and_model}">:}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Name:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
+<SMALL>(Darf alle druckbaren Zeichen außer "/", "#", und Leerzeichen enthalten)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beschreibung:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
+<SMALL>(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Ort:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
+<SMALL>(Für Menschen lesbarer Ort wie "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Freigabe:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+Diesen Drucker freigeben</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
+
+<H2 CLASS="title">>RSS Subskription hinzufügen</H2>
+
+<TABLE SUMMARY="Forumlar zum Hinzufügen einer RSS Subskription">
+<TR>
+<TH CLASS="label">Name:</TH>
+<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
+<SMALL>(Darf alle druckbaren Zeichen außer Leerzeichen, "/", "?", und "#" enthalten)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Warteschlange:</TH>
+<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Alle Warteschlangen</OPTION>{[printer_name]<OPTION VALUE="{printer_uri_supported}"{?PRINTER_URI={printer_uri_supported}? SELECTED:}>{printer_name}</OPTION>}</SELECT></TD>
+</TR>
+<TR VALIGN="TOP">
+<TH CLASS="label">Ereignisse:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Auftrag Erstellt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Auftrag Abgeschlossen<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Auftrag Gestoppt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Auftrags Parameter Geändert</TD>
+<TD> </TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Warteschlange Gestoppt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Warteschlange Hinzugefügt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Warteschlange Geändert<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Warteschlange Gelöscht</TD>
+<TD> </TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Server Gestartet<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Server Gestoppt<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Server Neu Gestartet<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Server Sicherheits Prüfung</TD>
+</TR>
+<TR>
+<TH CLASS="label">Maximale Ereignisse in Durchführung:</TH>
+<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="MAX_EVENTS" SIZE="4" MAXLENGTH="4" VALUE="{MAX_EVENTS?{MAX_EVENTS}:20}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD COLSPAN="5"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription hinzufügen"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<TABLE CLASS="indent" SUMMARY="Administrative Tätigkeiten">
+<TR><TD VALIGN="TOP">
+
+<H2 CLASS="title">Drucker</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Drucker hinzufügen"></FORM>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Verfügbare Drucker auflisten"></FORM>
+<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Drucker verwalten"></FORM>
+{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Drucker für Samba freigeben"></FORM>:}
+</P>
+
+<H2 CLASS="title">Klassen</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Klasse hinzufügen"></FORM>
+<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Klassen verwalten"></FORM>
+</P>
+
+<H2 CLASS="title">Druckaufträge</H2>
+
+<P>
+<FORM ACTION="/jobs/" METHDO="GET"><INPUT TYPE="SUBMIT" VALUE="Aufträge verwalten"></FORM>
+</P>
+
+</TD><TD> </TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Server</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Konfigurationsdatei bearbeiten"></FORM>
+<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Zugriffsprotokoll betrachten"></FORM>
+<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Fehlerprotokoll betrachten"></FORM>
+<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Seitenprotokoll betrachten"></FORM>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+{ADVANCEDSETTINGS?<P><B>Erweiterte Servereinstellungen\:</B></P>
+
+<P><A HREF="/admin/">Erweitert <SMALL>▼</SMALL></A><BR>
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="HIDDEN" NAME="ADVANCEDSETTINGS" VALUE="YES">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Zeige freigegebene Drucker von anderen Systemen<BR>
+ Protokolle\:
+<INPUT TYPE="CHECKBOX" NAME="BROWSE_REMOTE_CUPS" {?browse_remote_cups}> CUPS
+{HAVE_LDAP?<INPUT TYPE="CHECKBOX" NAME="BROWSE_REMOTE_LDAP" {?browse_remote_ldap}> LDAP:}
+{HAVE_LIBSLP?<INPUT TYPE="CHECKBOX" NAME="BROWSE_REMOTE_SLP" {?browse_remote_slp}> SLP:}<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Freigeben von Druckern welche mit diesem System verbunden sind<BR>
+ Klienten maximal\:
+<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ Protokolle\:
+<INPUT TYPE="CHECKBOX" NAME="BROWSE_LOCAL_CUPS" {?browse_local_cups}> CUPS
+{HAVE_DNSSD?<INPUT TYPE="CHECKBOX" NAME="BROWSE_LOCAL_DNSSD" {?browse_local_dnssd}> DNS-SD:}
+{HAVE_LDAP?<INPUT TYPE="CHECKBOX" NAME="BROWSE_LOCAL_LDAP" {?browse_local_ldap}> LDAP:}
+{HAVE_LIBSLP?<INPUT TYPE="CHECKBOX" NAME="BROWSE_LOCAL_SLP" {?browse_local_slp}> SLP:}<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Erlaube Drucken vom Internet aus<BR>
+ <INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Veröffentliche Webinterface<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Erlaube entfernte Verwaltung<BR>
+{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Benutze Kerberos Authentifizierung (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Erlaube Benutzern jeden Auftrag abzubrechen (nicht nur die Eigenen)<BR>
+<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOB_HISTORY" {?preserve_job_history}> Auftragsverlauf aufbewahren<BR>
+ Anzahl der Aufträge\:
+<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOB_FILES" {?preserve_job_files}> Dateien von Druckaufträgen aufbewahren<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Speichere Fehlerinformationen für Fehlersuche<BR>
+ Maximale Größe der Protokolldatei\:
+<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+:<P><B>Grundlegende Servereinstellungen:</B></P>
+
+<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Erweitert <SMALL>▶</SMALL></A><BR>
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Zeige freigegebene Drucker von anderen Systemen<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Freigeben von Druckern welche mit diesem System verbunden sind<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Erlaube Drucken vom Internet aus<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Erlaube entfernte Verwaltung<BR>
+{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Benutze Kerberos Authentifizierung (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Erlaube Benutzern jeden Auftrag abzubrechen (nicht nur die Eigenen)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Speichere Fehlerinformationen für Fehlersuche</P>
+
+}
+<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Einstellungen ändern"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
+
+<DIV CLASS="indent">
+
+<H2 CLASS="title">RSS Subskriptionen</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription hinzufügen"></FORM>
+</P>
+
+</DIV>
+
+{notify_subscription_id?<TABLE CLASS="list" SUMMARY=">RSS Subskriptionen">
+<THEAD><TR><TH>Name</TH><TH>Ereignis</TH><TH>Warteschlange</TH></TR></THEAD>
+<TBODY>{[notify_subscription_id]
+<TR><TD><A HREF="{notify_recipient_uri}">{notify_recipient_name}</A><BR>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-subscription"><INPUT TYPE="HIDDEN" NAME="notify_subscription_id" VALUE="{notify_subscription_id}"><INPUT TYPE="SUBMIT" VALUE="RSS Subskription kündigen"></FORM> </TD><TD>{notify_events}</TD><TD NOWRAP> {notify_printer_name?{notify_printer_name}:Alle Warteschlangen}</TD></TR>}
+</TBODY>
+</TABLE>:}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+{CUPS_GET_DEVICES_DONE?:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Busy Indicator"> Suche nach Druckern...</P>}
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+
+<TABLE>
+{op=add-printer?:<TR>
+<TH CLASS="label">Aktuelle Verbindung:</TH>
+<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
+{current_device_uri}</TD>
+</TR>}
+<TR>
+<TH CLASS="label">Lokale Drucker:</TH>
+<TD>
+{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
+:}}
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Entdeckte Netzwerkdrucker:</TH>
+<TD>
+{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
+:}:}}
+</TD>
+</TR>
+<TR>
+<TR>
+<TH CLASS="label">Andere Netzwerkdrucker:</TH>
+<TD>
+{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
+VALUE="{device_uri}{?device_make_and_model!Unbekannt?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}<BR>
+}:}}
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<TABLE>
+{op=modify-printer?:<TR>
+<TH CLASS="label">Name:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>}
+<TR>
+<TH CLASS="label">Beschreibung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Ort:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Freigabe:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
+Diesen Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} freigeben</TD>
+</TR>
+<TR>
+<TH CLASS="label">Marke:</TH>
+<TD>
+<SELECT NAME="PPD_MAKE" SIZE="10">
+{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD> </TD>
+</TR>
+<TR>
+<TH CLASS="label">Oder stellen Sie eine PPD Datei bereit:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Drucker hinzufügen:Drucker ändern}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+<TABLE>
+{op=modify-printer?:<TR>
+<TH CLASS="label">Name:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>}
+<TR>
+<TH CLASS="label">Beschreibung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Ort:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Freigabe:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
+Diesen Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} freigeben</TD>
+</TR>
+<TR>
+<TH CLASS="label">Marke:</TH>
+<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Andere(n) Marke/Hersteller auswählen"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Modell:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Aktueller Treiber - {current_make_and_model}</OPTION>:}
+{[ppd_name]<OPTION VALUE="{ppd_name}" {op=modify-printer?:{?current_make_and_model={ppd_make_and_model}?SELECTED:}}>{ppd_make_and_model} ({ppd_natural_language})
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">>Oder stellen Sie eine PPD Datei bereit:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{op=add-printer?Drucker hinzufügen:Drucker ändern}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Baud Rate:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Parität:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Keine
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Gerade
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Ungerade
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Daten Bits:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Flußkontrolle:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>None
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Software)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Hardware)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Hardware)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{printer_name?<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">:}
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<TABLE>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="TEXT" SIZE="60" MAXLENGTH="1024" NAME="DEVICE_URI" VALUE="{current_device_uri?{current_device_uri}:{device_uri}}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>Beispiele:
+<PRE>
+ http://Hostname:631/ipp/
+ http://Hostname:631/ipp/Anschluss1
+
+ ipp://Hostname/ipp/
+ ipp://Hostname/ipp/Anschluss1
+
+ lpd://Hostname/Warteschlange
+
+ socket://Hostname
+ socket://Hostname:9100
+</PRE>
+
+<P>Bitte lesen Sie <A HREF="/help/network.html" TARGET="_blank">"Netzwerk
+Drucker"</A> um die korrekte URI für Ihren Drucker zu benutzen.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Klasse hinzufügen</H2>
+
+<P>Die Klasse <A HREF="/classes/{printer_name}">{printer_name}</A> wurde erfolgreich
+hinzugefügt.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Klasse {printer_name} löschen</H2>
+
+<P><B>Warning:</B> Sind Sie sicher Sie wollen die Klasse
+{printer_name} löschen?</P>
+
+<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="op" VALUE="delete-class"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Klasse löschen"></FORM></P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Klasse {printer_name} löschen</H2>
+
+<P>Die Klasse {printer_name} wurde erfolgreich gelöscht.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+<H3 CLASS="title">Aufträge</H3>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Klasse {printer_name} ändern</H2>
+
+<P>Die Klasse <A HREF="/classes/{printer_name}">{printer_name}</A> wurde
+erfolgreich geändert.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}},
+{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert},
+{server_is_sharing_printers=0?Nicht:{printer_is_shared=0?Nicht:}} Freigegeben{default_name={printer_name}?, Standarddrucker:})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Wartung</OPTION>
+<OPTION VALUE="print-test-page">Drucke Testseite</OPTION>
+{printer_state=5?<OPTION VALUE="start-class">Klasse starten</OPTION>:<OPTION VALUE="stop-class">Klasse stoppen</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aufträge akzeptieren</OPTION>:<OPTION VALUE="reject-jobs">Aufträge ablehnen</OPTION>}
+<OPTION VALUE="move-jobs">Alle Aufträge verschieben</OPTION>
+<OPTION VALUE="purge-jobs">Alle Aufträge abbrechen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
+<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
+<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
+<OPTION VALUE="">Administration</OPTION>
+<OPTION VALUE="modify-class">Klasse ändern</OPTION>
+<OPTION VALUE="delete-class">Klasse löschen</OPTION>
+<OPTION VALUE="set-class-options">Standardeinstellungen festlegen</OPTION>
+<OPTION VALUE="set-as-default">Als Standard festlegen</OPTION>
+<OPTION VALUE="set-allowed-users">Erlaubte Benutzer festlegen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Beschreibung:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ort:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Mitglieder:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Standardeinstellungen:</TH><TD>job-sheets={job_sheets_default}
+media={media_default?{media_default}:unbekannt}
+{sides_default?sides={sides_default}:}</TD></TR>
+</TABLE>
+
+</DIV>
--- /dev/null
+<P ALIGN="CENTER">{total=0?Keine Klassen:Zeige {#printer_name} von {total} Klasse{total=1?:n}}.</P>
--- /dev/null
+{#printer_name=0?:
+<TABLE CLASS="list" SUMMARY="Class List">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&WHICH_JOBS={?WHICH_JOBS}&FIRST={FIRST}&ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>▲</SMALL> Wartweschlange <SMALL>▲</SMALL>:<SMALL>▼</SMALL> Warteschlange <SMALL>▼</SMALL>}</A></TH><TH>Beschreibung</TH><TH>Ort</TH><TH>Mitglieder</TH><TH>Status</TH></TR>
+</THEAD>
+<TBODY>
+{[printer_name]
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{?member_uris=?Keine:{member_uris}}</TD><TD>{printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+}
+</TBODY>
+</TABLE></DIV>}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{title} auf {printer_name}</H2>
+
+<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
+ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Drucker Befehlsauftrag
+{job_state=3?unerledigt:{job_state=4?gehalten:
+{job_state=5?verarbeite:{job_state=6?gestoppt:
+{job_state=7?gelöscht:{job_state=8?abgebrochen:beendet}}}}}}{job_state=9?:{job_printer_state_message?,
+<EM>"{job_printer_state_message}"</EM>:}}</P>
+
+</DIV>
--- /dev/null
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+ document.cups.CUPSDCONF.value = "{?cupsdconf_default}";
+}
+</SCRIPT>
+
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Konfigurationsdatei ändern</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="SUBMIT" NAME="SAVECHANGES" VALUE="Änderungen speichern">
+<INPUT TYPE="BUTTON" VALUE="Standard Konfigurationsdatei verwenden"
+onClick="reset_config();"></P>
+
+</FORM>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{?title} {?printer_name} Error</H2>
+
+<P>Fehler:</P>
+
+<BLOCKQUOTE>Unbekannte Operation "{op}"!</BLOCKQUOTE>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{?title} {?printer_name} Error</H2>
+
+<P>{?message?{message}:Fehler:}</P>
+
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+
+</DIV>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.png" TYPE="image/png">
+ {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
+</HEAD>
+<BODY>
+<TABLE CLASS="page" SUMMARY="{title}">
+<TR><TD CLASS="body">
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" SUMMARY="">
+<TR HEIGHT="36">
+<TD><A HREF="http://www.cups.org/" TARGET="_blank"><IMG
+SRC="/images/left.gif" WIDTH="64" HEIGHT="36" BORDER="0" ALT=""></A></TD>
+<TD CLASS="unsel"><A HREF="/"> Startseite </A></TD>
+<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin"> Verwaltung </A></TD>
+<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/"> Klassen </A></TD>
+<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/"> Online Hilfe </A></TD>
+<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/"> Aufträge </A></TD>
+<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/"> Drucker </A></TD>
+<TD CLASS="unsel" WIDTH="100%"><FORM ACTION="/help/" METHOD="GET"><INPUT
+TYPE="SEARCH" NAME="QUERY" SIZE="20" PLACEHOLDER="Search Help"
+VALUE="{SECTION=help?{?QUERY}:}" AUTOSAVE="org.cups.help" RESULTS="20"></FORM></TD>
+<TD><IMG SRC="/images/right.gif" WIDTH="4" HEIGHT="36" ALT=""></TD>
+</TR>
+<TR><TD COLSPAN="9"> </TD></TR>
+</TABLE>
--- /dev/null
+<DIV CLASS="indent">
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Suche in
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}:</B> <INPUT
+TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
+AUTOSAVE="org.cups.help" RESULTS="20">
+<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Suchen">
+<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Leeren"></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Inhalt">
+<TR><TD>
+
+<H3 CLASS="title">On-Line Hilfe Dokumente</H3>
+
+<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Alle Dokumente</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</TD></TR>
+</TABLE></DIV>
+
+{QUERY?<P>Suchergebnisse in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Keine Übereinstimmung gefunden.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}</H1>
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Druckversion anzeigen"></FORM>:
+
+<H1>CUPS Hilfeseiten</H1>
+
+<P>Dies ist das CUPS online Hilfesystem. Geben Sie Ihren Suchbegriff
+oben ein oder klicken Sie auf einen der Dokumentationslinks
+um sich die Online Hilfe Informationen anzeigen zu lassen.</P>
+
+<P>Wenn Sie noch unerfahren im Umgang mit CUPS sind, lesen Sie die "<a
+href="/help/overview.html">CUPS Übersicht</a>".
+Erfahrene Benutzer sollten "<a href="/help/whatsnew.html">Was ist neu in CUPS
+1.4</a>" lesen.</P>
+
+<P>Die <A HREF="http://www.cups.org/">CUPS Webseite</A> bietet
+ebenfalls viele Angebote inklusive Benutzer Diskussionsforen,
+Antworten auf häufig gestellte Fragen, und ein Formular für
+Fehlerberichte und Wünsche.</P>}
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>{HELPTITLE}</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+
+<H1>{HELPTITLE}</H1>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Auftrag {job_id} löschen</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde gelöscht.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Auftrag {job_id} anhalten</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde vom Drucken abgehalten.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
+
+<H2 CLASS="title">{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Neues Ziel:</TH>
+<TD>
+<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
+{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="{job_id?Auftrag verschieben:Aufträge verschieben}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}</H2>
+
+<P>{job_id?<A HREF="/jobs/{job_id}">Auftrag {job_id}</A>:Alle Aufträge} nach
+<A HREF="{job_printer_uri}">{job_printer_name}</A> verschoben.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Auftrag {job_id} freigeben</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde zum Drucken freigegeben.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Auftrag {job_id} neu starten</H2>
+
+<P><A HREF="{job_printer_uri}">Auftrag {job_id}</A> wurde neu gestartet.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Aktive Aufträge anzeigen"></FORM>}
+{?which_jobs=completed?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="completed"><INPUT TYPE="SUBMIT" VALUE="Fertige Aufträge anzeigen"></FORM>}
+{?which_jobs=all?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="which_jobs" VALUE="all"><INPUT TYPE="SUBMIT" VALUE="Alle Aufträge anzeigen"></FORM>}</DIV>
+
+<P ALIGN="CENTER">{total=0?Keine Aufträge:Zeige {#job_id} von {total} {?which_jobs=?aktiven:{which_jobs=all?:beendeten}} {total=1?Auftrag:Aufträgen}}.</P>
--- /dev/null
+{#job_id=0?:
+<TABLE CLASS="list" SUMMARY="Auftragsliste">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&WHICH_JOBS={?WHICH_JOBS}&FIRST={FIRST}&ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>▲</SMALL> ID <SMALL>▲</SMALL>:<SMALL>▼</SMALL> ID <SMALL>▼</SMALL>}</A></TH><TH>Name</TH><TH>Benutzer</TH><TH>Größe</TH><TH>Seiten</TH><TH>Status</TH><TH>Kontrolle</TH></TR>
+</THEAD>
+<TBODY>
+{[job_id]
+<TR VALIGN="TOP">
+<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id} </TD>
+<TD>{?job_name=?Unbekannt:{job_name}} </TD>
+<TD>{job_originating_user_name} </TD>
+<TD>{job_k_octets}k </TD>
+<TD>{job_media_sheets_completed=0?Unbekannt:{?job_media_sheets_completed}} </TD>
+<TD>{job_state=3?unerledigt seit<BR>{time_at_creation}:{job_state=4?angehalten seit<BR>{time_at_creation}:
+{job_state=5?verarbeitet seit<BR>{time_at_processing}:{job_state=6?gestoppt:
+{job_state=7?getlöscht am<BR>{time_at_completed}:{job_state=8?abgebrochen:beendet am<BR>{time_at_completed}}}}}}} {job_printer_state_message?<BR>
+<EM>"{job_printer_state_message}"</EM>:}</TD>
+<TD>
+{job_preserved>0?{job_state>5?
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="restart-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
+<INPUT TYPE="SUBMIT" VALUE="Auftrag neu drucken"></FORM>:}:}
+{job_state=4?
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="release-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
+<INPUT TYPE="SUBMIT" VALUE="Auftrag freigeben"></FORM>:}
+{job_state=3?
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="hold-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
+<INPUT TYPE="SUBMIT" VALUE="Auftrag anhalten"></FORM>:}
+{job_state<7?
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="cancel-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="HIDDEN" NAME="job_printer_uri" VALUE="{job_printer_uri}">
+<INPUT TYPE="SUBMIT" VALUE="Auftrag löschen"></FORM>
+<FORM ACTION="/jobs/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="move-job"><INPUT TYPE="HIDDEN" NAME="job_id" VALUE="{job_id}"><INPUT TYPE="SUBMIT" VALUE="Auftrag verschieben"></FORM>:}
+ </TD>
+</TR>
+}
+</TBODY>
+</TABLE>
+}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Verfügbare Drucker</H2>
+
+{#device_uri=0?<P>Keine Drucker gefunden.</P>
+:<UL>{[device_uri]
+<LI><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="HIDDEN" NAME="TEMPLATE_NAME" VALUE="{template_name}"><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="Local Printer"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Diesen Drucker hinzufügen"></FORM>
+{device_make_and_model} ({device_info})</LI>
+}</UL>}
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Klasse {printer_name} ändern</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<TABLE>
+<TR>
+<TH CLASS="label">Beschreibung:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Ort:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Mitglieder:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Klasse ändern"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{printer_name} ändern</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+
+<TABLE>
+<TR>
+<TH CLASS="label">Beschreibung:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Ort:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Für Menschen lesbarer Ort wie "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Verbindung:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Freigabe:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+Diesen Drucker freigeben</TD>
+</TR>
+<TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Weiter"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Change Settings</H2>
+
+<P>Der Server wurde nicht neu gestartet, da die Konfiguration
+nicht geändert wurde...</P>
+
+</DIV>
--- /dev/null
+<TR>
+<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD>
+{[choices]<INPUT TYPE="RADIO" NAME="{keyword}" {choices={defchoice}?CHECKED:} VALUE="{choices}">{text}}
+</TD>
+</TR>
--- /dev/null
+<P><B>Error:</B> The following options are conflicting:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Bitte ändern sie eine oder mehrere Einstellungen um die Konflikte zu lösen.</P>
--- /dev/null
+<DIV CLASS="tab" ID="{group_id}">
+
+<H3 ALIGN="CENTER">{group}</H3>
+
+<TABLE WIDTH="100%">
--- /dev/null
+<TR>
+<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
--- /dev/null
+<TR>
+<TH {conflicted=1?CLASS="conflict":CLASS="label"} WIDTH="50%"><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" ID="select-{keyword}" ONCHANGE="update_paramtable('{keyword}')">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT>
+{iscustom=1?<TABLE NAME="paramtable" id="{keyword}-params">{[params]
+<TR><TH CLASS="sublabel">{paramtext}:</TH>
+<TD>{params=Units?<SELECT NAME="{keyword}.{params}">
+<OPTION VALUE="pt"{paramvalue=pt? SELECTED:}>Punkte</OPTION>
+<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Millimeter</OPTION>
+<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Zentimeter</OPTION>
+<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Zoll</OPTION>
+<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Fuß</OPTION>
+<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Meter</OPTION>
+</SELECT>:<INPUT TYPE="{inputtype}" NAME="{keyword}.{params}" VALUE="{paramvalue}">}</TD></TR>
+}</TABLE>
+</TD>:}
+</TR>
--- /dev/null
+</TABLE>
+
+<P ALIGN="CENTER"><INPUT TYPE="SUBMIT" VALUE="Standardeinstellungen festlegen"></P>
+
+</DIV>
--- /dev/null
+<TABLE CLASS="inset" SUMMARY="Seitenverwaltung">
+<TR>
+ <TD WIDTH="50%">{PREV?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{PREV}"><INPUT TYPE="SUBMIT" VALUE="◀ Vorherige anzeigen"></FORM>: }</TD>
+ <TD WIDTH="50%" ALIGN="RIGHT">{NEXT?<FORM ACTION="{THISURL}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="QUERY" VALUE="{?QUERY}"><INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{?ORDER}"><INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{?WHICH_JOBS}"><INPUT TYPE="HIDDEN" NAME="FIRST" VALUE="{NEXT}"><INPUT TYPE="SUBMIT" VALUE="Nächste anzeigen ▶"></FORM>: }</TD>
+</TR>
+</TABLE>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Aufträge von {is_class?Klasse:Drucker} {printer_name} akzeptieren</H2>
+
+<P>{is_class?Klasse:Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+aktzeptiert jetzt Aufträge.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Drucker hinzufügen</H2>
+
+<P>Drucker <A HREF="/printers/{printer_name}">{printer_name}</A> wurde erfolgreich
+hinzufügt.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Standardeinstellungen für {printer_name} festlegen</H2>
+
+<P>Standardeinstellungen für {OP=set-class-options?Klasse <A HREF="/classes/{printer_name}">:Drucker <A HREF="/printers/{printer_name}">}{printer_name}</A>
+wurden erfolgreich gesetzt.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Drucker {printer_name} löschen</H2>
+
+<P><B>Warnung:</B> Sind sie sicher sie wollen den Drucker
+{printer_name} löschen?</P>
+
+<P ALIGN="CENTER"><FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="delete-printer"><INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}"><INPUT TYPE="SUBMIT" NAME="confirm" VALUE="Drucker löschen"></FORM></P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{is_class?Klasse:Drucker} {printer_name} als Standard festlegen</H2>
+
+<P>{is_class?Klasse:Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurde zum Standarddrucker für diesen Server gemacht.</P>
+
+<BLOCKQUOTE><B>Notiz:</B> Die Einstellungen des Standarddruckers
+welche von Benutzern mittels dem <TT>lpoptions</TT> Befehl gesetzt wurden,
+überschreiben diese Einstellung.</BLOCKQUOTE>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Drucker {printer_name} löschen</H2>
+
+<P>Drucker {printer_name} wurde erfolgreich gelöscht.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+<H3 CLASS="title">Aufträge</H3>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Drucker {printer_name} ändern</H2>
+
+<P>Drucker <A HREF="/printers/{printer_name}">{printer_name}</A> wurde
+erfolgreich geändert.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Aufträge für {is_class?die Klasse:den Drucker} {printer_name} verwerfen</H2>
+
+<P>Aufträge für {is_class?die Klasse:den Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurden verworfen.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Aufträge für {is_class?die Klasse:den Drucker} {printer_name} ablehnen</H2>
+
+<P>{is_class?Die Klasse:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+akzeptiert keine weiteren Aufträge.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{is_class?Die Klasse:Den Drucker} {printer_name} fortfahren</H2>
+
+<P>{is_class?Die Klassen:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wird fortgesetzt.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{is_class?Die Klasse:Den Drucker} {printer_name} anhalten</H2>
+
+<P>{is_class?Die Klasse:Der Drucker} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+wurde angehalten.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Frei:{printer_state=4?Beschäftig:Angehalten}},
+{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert},
+{server_is_sharing_printers=0?Nicht:{printer_is_shared=0?Nicht:}} freigegeben{default_name={printer_name}?, Standarddrucker:})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Wartung</OPTION>
+<OPTION VALUE="print-test-page">Testseite drucken</OPTION>
+{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Druckköpfe reinigen</OPTION>:}
+{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Selbsttest-Seite drucken</OPTION>:}
+{printer_state=5?<OPTION VALUE="start-printer">Drucker starten</OPTION>:<OPTION VALUE="stop-printer">Drucker stoppen</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Aufträge akzeptieren</OPTION>:<OPTION VALUE="reject-jobs">Aufträge ablehnen</OPTION>}
+<OPTION VALUE="move-jobs">Alle Aufträge verschieben</OPTION>
+<OPTION VALUE="purge-jobs">Alle Aufträge abbrechen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<FORM METHOD="POST" ACTION="{admin_uri}" NAME="administration">
+<INPUT TYPE="HIDDEN" NAME="printer_name" VALUE="{printer_name}">
+<SELECT NAME="OP" ONCHANGE="document.administration.submit();">
+<OPTION VALUE="">Administration</OPTION>
+<OPTION VALUE="modify-printer">Drucker ändern</OPTION>
+<OPTION VALUE="delete-printer">Drucker löschen</OPTION>
+<OPTION VALUE="set-printer-options">Standardeinstellungen festlegen</OPTION>
+<OPTION VALUE="set-as-default">Als Standard festlegen</OPTION>
+<OPTION VALUE="set-allowed-users">Erlaubte Benutzer festlegen</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Go" STYLE="display: none;">
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Beschreibung:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Ort:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Treiber:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Verbindung:</TH><TD>{device_uri}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Einstellungen:</TH><TD>job-sheets={job_sheets_default}
+media={media_default?{media_default}:unknown}
+{sides_default?sides={sides_default}:}</TD></TR>
+</TABLE>
+
+</DIV>
--- /dev/null
+<P ALIGN="CENTER">{total=0?Keine Drucker:Zeige {#printer_name} von {total} Drucker}.</P>
--- /dev/null
+{#printer_name=0?:
+<TABLE CLASS="list" SUMMARY="Druckerliste">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&WHICH_JOBS={?WHICH_JOBS}&FIRST={FIRST}&ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>▲</SMALL> Queue Name <SMALL>▲</SMALL>:<SMALL>▼</SMALL> Queue Name <SMALL>▼</SMALL>}</A></TH><TH>Beschreibung</TH><TH>Ort</TH><TH>Marke und Modell</TH><TH>Status</TH></TR>
+</THEAD>
+<TBODY>
+{[printer_name]
+<TR><TD><A HREF="{printer_uri_supported}">{printer_name}</A></TD><TD>{printer_info}</TD><TD>{printer_location}</TD><TD>{printer_make_and_model}</TD><TD>{printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+}
+</TBODY>
+</TABLE></DIV>}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Einstellungen ändern</H2>
+
+<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Busy Indicator"> Bitte warten Sie während der Server neu startet...</P>
+
+</DIV>
--- /dev/null
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+ var list = document.export_samba.EXPORT_NAME;
+ var sel = document.export_samba.EXPORT_ALL.checked;
+
+ for (i = 0; i < list.length; i ++) {
+ list.options[i].selected = sel;
+ }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Drucker für Samba freigeben</H2>
+
+{error?<P>Kann Drucker nicht für Samba freigeben\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Consult the <A HREF="/admin/log/error_log"
+TARGET="_blank">Fehlerprotokoll</A> Datei um mehr Informationen zu erhalten.</P>:
+<P>Diese Seite erlaubt es Ihnen Drucker für Samba bereitzustellen
+damit auf diese mittels Windows Clients über die Desktopsymbole
+<VAR>Netzwerk Nachbarn</VAR> oder <VAR>Netzwerkumgebung</VAR>
+zugegriffen werden kann. Sie müssen zuerst einen
+Windows PostScript Druckerteiber installieren wie diese in der Hilfe für <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A> beschrieben ist.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Drucker:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Alle Drucker freigeben
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Benutzername:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (benötigt)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Passwort:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (benötigt)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Drucker für Samba freigeben"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>Drucker wurden erfolgreich für Samba freigegeben.</P>
--- /dev/null
+<FORM ACTION="{THIS_URL}" METHOD="GET">
+{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
+{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
+
+<P ALIGN="CENTER"><B>Suche in
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klassen:{SECTION=jobs?Aufträgen:Drucker}}}:</B>
+<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
+TYPE="SUBMIT" VALUE="Suchen"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Leeren"></P>
+
+</FORM>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Standardeinstellungen f%uuml;r {printer_name} festlegen</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{HAVE_AUTOCONFIGURE?<INPUT TYPE="SUBMIT" NAME="AUTOCONFIGURE" VALUE="Drucker nach Standardeinstellungen fragen">:}
+
+<SCRIPT TYPE="text/javascript"><!--
+function update_paramtable(option)
+{
+ var cb = document.getElementById("select-" + option)
+ var paramstable = document.getElementById(option + "-params");
+ if (cb.value == "Custom")
+ paramstable.style.display = "table";
+ else
+ paramstable.style.display = "none";
+}
+--></SCRIPT>
+
+<H3 CLASS="title">{[group_id]
+<A HREF="#{group_id}">{group}</A> }</H3>
+
+<DIV CLASS="tabs">
--- /dev/null
+</DIV>
+
+<SCRIPT TYPE="text/javascript"><!--
+// Hide custom options parameters for browsers that understand Javascript
+var paramtables = document.getElementsByName("paramtable");
+for (var i = 0; i < paramtables.length; i++)
+{
+ var opt = paramtables[i].id.substr(0, paramtables[i].id.lastIndexOf("-"));
+ var cb = document.getElementById("select-" + opt);
+ if (cb.value != "Custom")
+ paramtables[i].style.display = "none";
+}
+--></SCRIPT>
+</FORM>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<P>Subskription {subscription_name} wurde erfolgreich hinzugefügt.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<P>Subskription #{notify_subscription_id} wurde gekündigt.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Print Test Page On {printer_name}</H2>
+
+<P>Testseite gesendet; Auftrags ID ist <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
+
+</DIV>
--- /dev/null
+</TD></TR>
+<TR><TD> </TD></TR>
+<TR><TD CLASS="trailer">CUPS und das CUPS Logo sind
+eingetragene Warenzeichen der <A HREF="http://www.apple.com">Apple Inc.</A> CUPS
+ist urheberrechtlich geschützt 2007-2009 von Apple Inc, alle Rechte vorbehalten.</TD></TR>
+</TABLE>
+</BODY>
+</HTML>
--- /dev/null
+<DIV CLASS="indent">
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
+
+<H2 CLASS="title">Erlaubte Benutzer für {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Benutzer:</TH>
+<TD>
+<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
+<BR>
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Erlaube diesen Benutzern zu drucken
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Verweigere diesen Benutzern zu drucken
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="SUBMIT" VALUE="Erlaubte Benutzer festlegen">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>