- Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056,
STR #3057)
+ - Fixed a localization problem for option choices (incorrectly) named
+ "Custom" (STR #3106)
- The fallback OpenSSL random number seeding would not work (STR #3079)
- The scheduler might miss a child signal, causing high CPU usage.
- The scheduler did not enforce quotas after the job history was
-CHANGES.txt - 2009-02-17
+CHANGES.txt - 2009-02-25
------------------------
CHANGES IN CUPS V1.4b3
- Documentation fixes (STR #3044, STR #3057)
- - Added complete localizations for Japanese and Russian and partial
- localizations for Chinese, Danish, German, Finnish, French, Italian,
- Korean, Norwegian, Polish, Portuguese, and Swedish (STR #3096,
- STR #3098)
+ - The cups-deviced helper program could miss reporting some backend
+ 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
# ifdef B115200
printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info);
- device, i + 1);
# else
printf("serial serial:%s?baud=38400 \"Unknown\" \"%s\"\n", device, info);
# endif /* B115200 */
*
* Backend test program for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2005 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
*
* Contents:
*
- * main() - Run the named backend.
- * usage() - Show usage information.
+ * main() - Run the named backend.
+ * usage() - Show usage information.
+ * walk_cb() - Show results of cupsSideChannelSNMPWalk...
*/
/*
*/
static void usage(void);
+static void walk_cb(const char *oid, const char *data, int datalen,
+ void *context);
/*
int first_arg, /* First argument for backend */
do_query = 0, /* Do PostScript query? */
do_side_tests = 0, /* Test side-channel ops? */
- do_trickle = 0; /* Trickle data to backend */
+ do_trickle = 0, /* Trickle data to backend */
+ do_walk = 0, /* Do OID lookup (0) or walking (1) */
+ show_log = 0; /* Show log messages from backends? */
+ const char *oid = ".1.3.6.1.2.1.43.10.2.1.4.1.1";
+ /* OID to lookup or walk */
char scheme[255], /* Scheme in URI == backend */
backend[1024]; /* Backend path */
const char *serverbin; /* CUPS_SERVERBIN environment variable */
for (first_arg = 1;
argv[first_arg] && argv[first_arg][0] == '-';
first_arg ++)
- if (!strcmp(argv[first_arg], "-ps"))
+ if (!strcmp(argv[first_arg], "-d"))
+ show_log = 1;
+ else if (!strcmp(argv[first_arg], "-ps"))
do_query = 1;
else if (!strcmp(argv[first_arg], "-s"))
do_side_tests = 1;
else if (!strcmp(argv[first_arg], "-t"))
do_trickle = 1;
+ else if (!strcmp(argv[first_arg], "-get") && (first_arg + 1) < argc)
+ {
+ first_arg ++;
+
+ do_side_tests = 1;
+ oid = argv[first_arg];
+ }
+ else if (!strcmp(argv[first_arg], "-walk") && (first_arg + 1) < argc)
+ {
+ first_arg ++;
+
+ do_side_tests = 1;
+ do_walk = 1;
+ oid = argv[first_arg];
+ }
else
usage();
static const char *ps_query = /* PostScript query file */
"%!\n"
"save\n"
+ "product = flush\n"
"currentpagedevice /PageSize get aload pop\n"
"2 copy gt {exch} if\n"
"(Unknown)\n"
write(1, ps_query, strlen(ps_query));
write(2, "DEBUG: START\n", 13);
- while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 30.0)) > 0)
+ while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 5.0)) > 0)
write(2, buffer, bytes);
write(2, "\nDEBUG: END\n", 12);
}
close(data_fds[1]);
}
+ if (!show_log)
+ {
+ close(2);
+ open("/dev/null", O_WRONLY);
+ }
+
close(3);
dup(back_fds[1]);
close(back_fds[0]);
printf("CUPS_SC_CMD_GET_STATE returned %s, %02X\n", statuses[scstatus],
buffer[0] & 255);
- length = sizeof(buffer);
- scstatus = cupsSideChannelSNMPGet(".1.3.6.1.2.1.43.10.2.1.4.1.1", buffer,
- &length, 5.0);
- printf("CUPS_SC_CMD_SNMP_GET returned %s, %s\n", statuses[scstatus],
- buffer);
+ if (do_walk)
+ {
+ /*
+ * Walk the OID tree...
+ */
+
+ scstatus = cupsSideChannelSNMPWalk(oid, 5.0, walk_cb, NULL);
+ printf("CUPS_SC_CMD_SNMP_WALK returned %s\n", statuses[scstatus]);
+ }
+ else
+ {
+ /*
+ * Lookup the same OID twice...
+ */
+
+ length = sizeof(buffer);
+ scstatus = cupsSideChannelSNMPGet(oid, buffer, &length, 5.0);
+ printf("CUPS_SC_CMD_SNMP_GET %s returned %s, %s\n", oid,
+ statuses[scstatus], buffer);
+
+ length = sizeof(buffer);
+ scstatus = cupsSideChannelSNMPGet(oid, buffer, &length, 5.0);
+ printf("CUPS_SC_CMD_SNMP_GET %s returned %s, %s\n", oid,
+ statuses[scstatus], buffer);
+ }
length = 0;
scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_SOFT_RESET, buffer,
static void
usage(void)
{
- fputs("Usage: testbackend [-ps] [-s] [-t] device-uri job-id user title copies "
- "options [file]\n", stderr);
+ puts("Usage: testbackend [-d] [-ps] [-s [-oid OID] [-walk OID]] [-t] "
+ "device-uri job-id user title copies options [file]");
+ puts("");
+ puts("Options:");
+ puts(" -d Show log messages from backend.");
+ puts(" -oid OID Lookup the specified SNMP OID.");
+ puts(" -ps Send PostScript query code to backend.");
+ puts(" -s Do SNMP tests.");
+ puts(" -t Send spaces slowly to backend ('trickle').");
+ puts(" -walk OID Walk the specified SNMP OID.");
+
exit(1);
}
+/*
+ * 'walk_cb()' - Show results of cupsSideChannelSNMPWalk...
+ */
+
+static void
+walk_cb(const char *oid, /* I - OID */
+ const char *data, /* I - Data */
+ int datalen, /* I - Length of data */
+ void *context) /* I - Context (unused) */
+{
+ printf("CUPS_SC_CMD_SNMP_WALK %s=%s (%d bytes)\n", oid, data, datalen);
+}
+
+
/*
* End of "$Id$".
*/
NULL, url);
}
else
- ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL,
- "ipp://localhost/jobs");
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL,
+ "ipp://localhost/");
if ((which_jobs = cgiGetVariable("which_jobs")) != NULL)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs",
*
* CGI form variable and array functions.
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2005 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
if ((var = cgi_find_variable(name)) == NULL)
return (NULL);
- if (var->nvalues == 1)
- return (var->values[0]);
-
if (element < 0 || element >= var->nvalues)
return (NULL);
# All printer operations require a printer operator to authenticate...
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
- Require user @CUPS_DEFAULT_PRINTADMIN_AUTH@
+ Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@
Order deny,allow
</Limit>
# Only the owner or an administrator can cancel or authenticate a job...
<Limit Cancel-Job CUPS-Authenticate-Job>
- Require user @OWNER @CUPS_DEFAULT_PRINTADMIN_AUTH@
+ Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@
Order deny,allow
</Limit>
# All printer operations require a printer operator to authenticate...
<Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs>
AuthType Default
- Require user @CUPS_DEFAULT_PRINTADMIN_AUTH@
+ Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@
Order deny,allow
</Limit>
# Only the owner or an administrator can cancel or authenticate a job...
<Limit Cancel-Job CUPS-Authenticate-Job>
AuthType Default
- Require user @OWNER @CUPS_DEFAULT_PRINTADMIN_AUTH@
+ Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@
Order deny,allow
</Limit>
AC_SUBST(DBUS_NOTIFIERLIBS)
dnl Extra platform-specific libraries...
-CUPS_DEFAULT_PRINTADMIN_AUTH="@SYSTEM"
+CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM"
CUPS_SYSTEM_AUTHKEY=""
FONTS="fonts"
LEGACY_BACKENDS="parallel scsi"
fi
if test "x$default_operkey" != xdefault; then
- CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin"
+ CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin"
elif grep -q system.print.operator /etc/authorization; then
- CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin"
+ CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin"
else
- CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin"
+ CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin"
fi])
AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H))
;;
esac
-AC_SUBST(CUPS_DEFAULT_PRINTADMIN_AUTH)
-AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTADMIN_AUTH, "$CUPS_DEFAULT_PRINTADMIN_AUTH")
+AC_SUBST(CUPS_DEFAULT_PRINTOPERATOR_AUTH)
+AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTOPERATOR_AUTH, "$CUPS_DEFAULT_PRINTOPERATOR_AUTH")
AC_SUBST(CUPS_SYSTEM_AUTHKEY)
AC_SUBST(FONTS)
AC_SUBST(LEGACY_BACKENDS)
*
* Configuration file 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.
*
* These coded instructions, statements, and computer programs are the
#define CUPS_DEFAULT_USER "lp"
#define CUPS_DEFAULT_GROUP "sys"
#define CUPS_DEFAULT_SYSTEM_GROUPS "sys root system"
-#define CUPS_DEFAULT_PRINTADMIN_AUTH "@SYSTEM"
+#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@SYSTEM"
/*
emit.o: ppd.h array.h versioning.h file.h string.h ../config.h debug.h
encode.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
encode.o: ipp-private.h string.h ../config.h debug.h
-file.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
-file.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
-file.o: i18n.h transcode.h debug.h
+file.o: file-private.h http-private.h ../config.h http.h versioning.h md5.h
+file.o: ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h
+file.o: language.h i18n.h transcode.h debug.h
getdevices.o: globals.h string.h ../config.h http-private.h http.h
getdevices.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
getdevices.o: file.h language.h i18n.h transcode.h debug.h
notify.o: i18n.h transcode.h
options.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
options.o: string.h ../config.h debug.h
-page.o: ppd.h array.h versioning.h file.h string.h ../config.h
+page.o: ppd.h array.h versioning.h file.h string.h ../config.h debug.h
ppd.o: ppd-private.h cups.h ipp.h http.h versioning.h ppd.h array.h file.h
ppd.o: language.h globals.h string.h ../config.h http-private.h md5.h
ppd.o: ipp-private.h i18n.h transcode.h debug.h
testconflicts.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h
testconflicts.o: language.h string.h ../config.h
testcups.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+testcups.o: string.h ../config.h
testfile.o: string.h ../config.h file.h versioning.h debug.h
testhttp.o: http-private.h ../config.h http.h versioning.h md5.h
testhttp.o: ipp-private.h ipp.h string.h
emit.32.o: emit.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h
encode.32.o: encode.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
encode.32.o: encode.c ipp-private.h string.h ../config.h debug.h
-file.32.o: file.c http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
-file.32.o: file.c ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
-file.32.o: file.c i18n.h transcode.h debug.h
+file.32.o: file.c file-private.h http-private.h ../config.h http.h versioning.h md5.h
+file.32.o: file.c ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h
+file.32.o: file.c language.h i18n.h transcode.h debug.h
getdevices.32.o: getdevices.c globals.h string.h ../config.h http-private.h http.h
getdevices.32.o: getdevices.c versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
getdevices.32.o: getdevices.c file.h language.h i18n.h transcode.h debug.h
notify.32.o: notify.c i18n.h transcode.h
options.32.o: options.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
options.32.o: options.c string.h ../config.h debug.h
-page.32.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h
+page.32.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h
ppd.32.o: ppd.c ppd-private.h cups.h ipp.h http.h versioning.h ppd.h array.h file.h
ppd.32.o: ppd.c language.h globals.h string.h ../config.h http-private.h md5.h
ppd.32.o: ppd.c ipp-private.h i18n.h transcode.h debug.h
testconflicts.32.o: testconflicts.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h
testconflicts.32.o: testconflicts.c language.h string.h ../config.h
testcups.32.o: testcups.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+testcups.32.o: testcups.c string.h ../config.h
testfile.32.o: testfile.c string.h ../config.h file.h versioning.h debug.h
testhttp.32.o: testhttp.c http-private.h ../config.h http.h versioning.h md5.h
testhttp.32.o: testhttp.c ipp-private.h ipp.h string.h
emit.64.o: emit.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h
encode.64.o: encode.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
encode.64.o: encode.c ipp-private.h string.h ../config.h debug.h
-file.64.o: file.c http-private.h ../config.h http.h versioning.h md5.h ipp-private.h
-file.64.o: file.c ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h
-file.64.o: file.c i18n.h transcode.h debug.h
+file.64.o: file.c file-private.h http-private.h ../config.h http.h versioning.h md5.h
+file.64.o: file.c ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h
+file.64.o: file.c language.h i18n.h transcode.h debug.h
getdevices.64.o: getdevices.c globals.h string.h ../config.h http-private.h http.h
getdevices.64.o: getdevices.c versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h
getdevices.64.o: getdevices.c file.h language.h i18n.h transcode.h debug.h
notify.64.o: notify.c i18n.h transcode.h
options.64.o: options.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
options.64.o: options.c string.h ../config.h debug.h
-page.64.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h
+page.64.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h
ppd.64.o: ppd.c ppd-private.h cups.h ipp.h http.h versioning.h ppd.h array.h file.h
ppd.64.o: ppd.c language.h globals.h string.h ../config.h http-private.h md5.h
ppd.64.o: ppd.c ipp-private.h i18n.h transcode.h debug.h
testconflicts.64.o: testconflicts.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h
testconflicts.64.o: testconflicts.c language.h string.h ../config.h
testcups.64.o: testcups.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h
+testcups.64.o: testcups.c string.h ../config.h
testfile.64.o: testfile.c string.h ../config.h file.h versioning.h debug.h
testhttp.64.o: testhttp.c http-private.h ../config.h http.h versioning.h md5.h
testhttp.64.o: testhttp.c ipp-private.h ipp.h string.h
* Administration utility API definitions for the Common UNIX Printing
* System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 2001-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
else if (!strcasecmp(value, "all"))
remote_any = 1;
}
- else if (line[0] != '<' && !in_location && !in_policy)
+ else if (line[0] != '<' && !in_location && !in_policy &&
+ strcasecmp(line, "Allow") &&
+ strcasecmp(line, "AuthType") &&
+ strcasecmp(line, "Deny") &&
+ strcasecmp(line, "Order") &&
+ strcasecmp(line, "Require") &&
+ strcasecmp(line, "Satisfy"))
cg->cupsd_num_settings = cupsAddOption(line, value,
cg->cupsd_num_settings,
&(cg->cupsd_settings));
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Require user @OWNER "
- CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
+ CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
" </Limit>\n");
}
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Require user @OWNER "
- CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
+ CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
" </Limit>\n");
in_cancel_job = 0;
" <Limit Cancel-Job>\n"
" Order deny,allow\n"
" Require user @OWNER "
- CUPS_DEFAULT_PRINTADMIN_AUTH "\n"
+ CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n"
" </Limit>\n");
cupsFilePuts(temp, " <Limit All>\n"
CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication @since CUPS 1.2/Mac OS X 10.5@ */
CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands @since CUPS 1.2/Mac OS X 10.5@ */
CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered and added @since CUPS 1.3/Mac OS X 10.5@ */
+ CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device @since CUPS 1.4@ */
+ CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities @since CUPS 1.4@ */
CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT | DEFAULT | FAX | REJECTING | DELETE | NOT_SHARED | AUTHENTICATED | COMMANDS | DISCOVERED) @private@ */
};
--- /dev/null
+/*
+ * "$Id$"
+ *
+ * Private file definitions for the Common UNIX Printing System (CUPS).
+ *
+ * Since stdio files max out at 256 files on many systems, we have to
+ * write similar functions without this limit. At the same time, using
+ * our own file functions allows us to provide transparent support of
+ * gzip'd print files, PPD files, etc.
+ *
+ * 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
+ * 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 _CUPS_FILE_PRIVATE_H_
+# define _CUPS_FILE_PRIVATE_H_
+
+/*
+ * Include necessary headers...
+ */
+
+# include <stdio.h>
+# include <stdlib.h>
+# include <stdarg.h>
+# include <errno.h>
+# include <fcntl.h>
+# include "http-private.h"
+# include "globals.h"
+# include "debug.h"
+
+# ifdef HAVE_LIBZ
+# include <zlib.h>
+# endif /* HAVE_LIBZ */
+# ifdef WIN32
+# include <io.h>
+# include <sys/locking.h>
+# endif /* WIN32 */
+
+
+/*
+ * Some operating systems support large files via open flag O_LARGEFILE...
+ */
+
+# ifndef O_LARGEFILE
+# define O_LARGEFILE 0
+# endif /* !O_LARGEFILE */
+
+
+/*
+ * Some operating systems don't define O_BINARY, which is used by Microsoft
+ * and IBM to flag binary files...
+ */
+
+# ifndef O_BINARY
+# define O_BINARY 0
+# endif /* !O_BINARY */
+
+
+/*
+ * Types and structures...
+ */
+
+struct _cups_file_s /**** CUPS file structure... ****/
+
+{
+ int fd; /* File descriptor */
+ char mode, /* Mode ('r' or 'w') */
+ compressed, /* Compression used? */
+ is_stdio, /* stdin/out/err? */
+ eof, /* End of file? */
+ buf[4096], /* Buffer */
+ *ptr, /* Pointer into buffer */
+ *end; /* End of buffer data */
+ off_t pos, /* Position in file */
+ bufpos; /* File position for start of buffer */
+
+#ifdef HAVE_LIBZ
+ z_stream stream; /* (De)compression stream */
+ Bytef cbuf[4096]; /* (De)compression buffer */
+ uLong crc; /* (De)compression CRC */
+#endif /* HAVE_LIBZ */
+
+ char *printf_buffer; /* cupsFilePrintf buffer */
+ size_t printf_size; /* Size of cupsFilePrintf buffer */
+};
+
+
+#endif /* !_CUPS_FILE_PRIVATE_H_ */
+
+/*
+ * End of "$Id$".
+ */
* our own file functions allows us to provide transparent support of
* gzip'd print files, PPD files, etc.
*
- * Copyright 2007-2008 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
* Include necessary headers...
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include "http-private.h"
-#include "globals.h"
-#include "debug.h"
-
-#ifdef HAVE_LIBZ
-# include <zlib.h>
-#endif /* HAVE_LIBZ */
-#ifdef WIN32
-# include <io.h>
-# include <sys/locking.h>
-#endif /* WIN32 */
-
-
-/*
- * Some operating systems support large files via open flag O_LARGEFILE...
- */
-
-#ifndef O_LARGEFILE
-# define O_LARGEFILE 0
-#endif /* !O_LARGEFILE */
-
-
-/*
- * Some operating systems don't define O_BINARY, which is used by Microsoft
- * and IBM to flag binary files...
- */
-
-#ifndef O_BINARY
-# define O_BINARY 0
-#endif /* !O_BINARY */
-
-
-/*
- * Types and structures...
- */
-
-struct _cups_file_s /**** CUPS file structure... ****/
-
-{
- int fd; /* File descriptor */
- char mode, /* Mode ('r' or 'w') */
- compressed, /* Compression used? */
- is_stdio, /* stdin/out/err? */
- eof, /* End of file? */
- buf[4096], /* Buffer */
- *ptr, /* Pointer into buffer */
- *end; /* End of buffer data */
- off_t pos, /* Position in file */
- bufpos; /* File position for start of buffer */
-
-#ifdef HAVE_LIBZ
- z_stream stream; /* (De)compression stream */
- Bytef cbuf[4096]; /* (De)compression buffer */
- uLong crc; /* (De)compression CRC */
-#endif /* HAVE_LIBZ */
-
- char *printf_buffer; /* cupsFilePrintf buffer */
- size_t printf_size; /* Size of cupsFilePrintf buffer */
-};
+#include "file-private.h"
/*
const char *value) _CUPS_API_1_4;
extern int cupsFilePuts(cups_file_t *fp, const char *s) _CUPS_API_1_2;
extern ssize_t cupsFileRead(cups_file_t *fp, char *buf, size_t bytes) _CUPS_API_1_2;
+extern ssize_t cupsFileReady(cups_file_t *fp) _CUPS_API_1_4;
extern off_t cupsFileRewind(cups_file_t *fp) _CUPS_API_1_2;
extern off_t cupsFileSeek(cups_file_t *fp, off_t pos) _CUPS_API_1_2;
extern cups_file_t *cupsFileStderr(void) _CUPS_API_1_2;
k > 0;
k --, choice ++)
{
- if (strcmp(choice->choice, "Custom"))
+ if (strcmp(choice->choice, "Custom") ||
+ !ppdFindCustomOption(ppd, option->keyword))
locattr = _ppdLocalizedAttr(ppd, option->keyword, choice->choice,
ll_CC);
else
DEBUG_printf(("cupsDoIORequest: Request length=%ld, total length=%ld",
(long)ippLength(request), (long)length));
+ /*
+ * Clear any "Local" authentication data since it is probably stale...
+ */
+
+ if (http->authstring && !strncmp(http->authstring, "Local ", 6))
+ httpSetAuthString(http, NULL, NULL);
+
/*
* Loop until we can send the request without authorization problems.
*/
return (HTTP_SERVICE_UNAVAILABLE);
}
- /*
- * Clear any "Local" authentication data since it is probably stale...
- */
-
- if (http->authstring && !strncmp(http->authstring, "Local ", 6))
- httpSetAuthString(http, NULL, NULL);
-
/*
* Loop until we can send the request without authorization problems.
*/
*/
if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET, CUPS_SC_STATUS_NONE, oid,
- (int)strlen(oid), timeout))
+ (int)strlen(oid) + 1, timeout))
return (CUPS_SC_STATUS_TIMEOUT);
real_datalen = sizeof(real_data);
*/
if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET_NEXT, CUPS_SC_STATUS_NONE,
- current_oid, (int)strlen(current_oid), timeout))
+ current_oid, (int)strlen(current_oid) + 1, timeout))
return (CUPS_SC_STATUS_TIMEOUT);
real_datalen = sizeof(real_data);
* Save DBCS/VBCS charset map into memory for transcoding...
*/
- leadchar = 0;
wide2uni = NULL;
cupsFileRewind(fp);
}
}
else
- strcpy(uri, "ipp://localhost/jobs");
+ strcpy(uri, "ipp://localhost/");
if (!http)
if ((http = _cupsConnect()) == NULL)
if test -d $$lang; then \
$(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang; \
$(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \
- $(INSTALL_MAN) $$lang/cups.css $(DOCDIR)/$$lang 2>/dev/null || true; \
+ test -f $$lang/cups.css && $(INSTALL_MAN) $$lang/cups.css $(DOCDIR)/$$lang; \
fi; \
done
<td>0x01000000</td>
<td>Queue was automatically discovered and added.</td>
</tr>
+<tr>
+ <td>0x02000000</td>
+ <td>Queue is a scanner with no printing capabilities.</td>
+</tr>
+<tr>
+ <td>0x04000000</td>
+ <td>Queue is a printer with scanning capabilities.</td>
+</tr>
</tbody>
</table></div>
CUPS PPD extensions specification 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.
These coded instructions, statements, and computer programs are the
*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"
</pre>
+<h3><span class='info'>Mac OS X 10.6</span><a name='APScannerOnly'>APScannerOnly</a></h3>
+
+<p class='summary'>*APScannerOnly: boolean</p>
+
+<p>This attribute specifies whether the device has scanning but no printing
+capabilities. The default is <tt>False</tt>.</p>
+
+<p>Examples:</p>
+
+<pre class='command'>
+*APICADriver: True
+*APScannerOnly: True
+</pre>
+
<h3><span class='info'>Mac OS X 10.3</span><a name='APScanAppBundleID'>APScanAppBundleID</a></h3>
<p class='summary'>*APScanAppBundleID: "bundle ID"</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>Strona domowa - 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="/"> Strona domowa </A></TD>
+<TD CLASS="unsel"><A HREF="/admin"> Administracja </A></TD>
+<TD CLASS="unsel"><A HREF="/classes/"> Klasy </A></TD>
+<TD CLASS="unsel"><A HREF="/help/"> Pomoc online </A></TD>
+<TD CLASS="unsel"><A HREF="/jobs/"> Zadania </A></TD>
+<TD CLASS="unsel"><A HREF="/printers/"> Drukowanie </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>Wspólny uniksowy system drukowania @CUPS_VERSION@</H1>
+
+<P>CUPS jest opartym na standardach systemem drukowania na licencji open source, tworzonym przez
+<A HREF="http://www.apple.com/">Apple Inc.</A> dla Mac OS<SUP>®</SUP> X i
+innych systemów operacyjnych podobnych do Uniksa<SUP>®</SUP>.</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 dla użytkowników</H2>
+
+<P><A HREF="help/overview.html">Przegląd CUPS</A></P>
+
+<P><A HREF="help/options.html">Drukowanie i opcje w wierszu poleceń</A></P>
+
+<P><A HREF="help/whatsnew.html">Co nowego w CUPS 1.4</A></P>
+
+<P><A HREF="http://www.cups.org/newsgroups.php?gcups.general">Forum użytkowników</A></P>
+
+</TD><TD VALIGN="top" STYLE="border-right: dotted thin #cccccc; padding-left: 20px; padding-right: 20px;">
+
+<H2>CUPS dla administratorów</H2>
+
+<P><A HREF="admin">Dodawanie drukarek i klas</A></P>
+
+<P><A HREF="help/policies.html">Zarządzanie politykami operacji</A></P>
+
+<P><A HREF="help/accounting.html">Podstawy kont drukowania</A></P>
+
+<P><A HREF="help/security.html">Bezpieczeństwo systemu</A></P>
+
+<P><A HREF="help/kerberos.html">Używanie uwierzytelniania Kerberosa</A></P>
+
+<P><A HREF="help/network.html">Używanie drukarek sieciowych</A></P>
+
+<P><A HREF="help/ref-cupsd-conf.html">Informacje o cupsd.conf</A></P>
+
+<P><A HREF="http://www.cups.org/ppd.php">Wyszukiwanie sterowników drukarek</A></P>
+
+</TD><TD VALIGN="top" STYLE="padding-left: 20px;">
+
+<H2>CUPS dla programistów</H2>
+
+<P><A HREF="help/api-overview.html">Wprowadzenie do programowania CUPS</A></P>
+
+<P><A HREF="help/api-cups.html">API CUPS</A></P>
+
+<P><A HREF="help/api-filter.html">Programowanie filtrów i modułów przetwarzających</A></P>
+
+<P><A HREF="help/api-httpipp.html">API HTTP i IPP</A></P>
+
+<P><A HREF="help/api-ppd.html">API PPD</A></P>
+
+<P><A HREF="help/api-raster.html">API rastrowe</A></P>
+
+<P><A HREF="help/ref-ppdcfile.html">Informacje o kompilatorze plików informacji o sterownikach PPD</A></P>
+
+<P><A HREF="http://www.cups.org/newsgroups.php?gcups.development">Forum programistów</A></P>
+
+</TD></TR>
+</TABLE>
+
+</TD></TR>
+<TR><TD> </TD></TR>
+<TR><TD CLASS="trailer">Wspólny uniksowy system drukowania, CUPS i logo CUPS
+są znakami handlowymi <A HREF="http://www.apple.com">Apple Inc.</A> CUPS
+copyright 2007-2009 Apple Inc. Wszystkie prawa zastrzeżone.</TD></TR>
+</TABLE>
+</BODY>
+</HTML>
+#
+# "$Id$"
+#
+# Message catalog template for the Common UNIX Printing System (CUPS).
+#
+# Copyright 2007-2008 by Apple Inc.
+# Copyright 2005-2007 by Easy Software Products.
+#
+# 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/".
+#
+
+#
+# Notes for Translators:
+#
+# The following prefixes MUST NOT be translated: "ALERT:", "CRIT:", "INFO:",
+# "NOTICE:", and "WARNING:".
+#
+# The "checkpo" program located in the "locale" source directory can be used
+# to verify that your translations do not introduce formatting errors or other
+# problems. Run with:
+#
+# cd locale
+# ./checkpo cups_LL.po
+#
+# where "LL" is your locale.
+#
msgid ""
msgstr ""
"Project-Id-Version: CUPS 1.4\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
"POT-Creation-Date: 2009-01-30 09:28-0800\n"
-"PO-Revision-Date: 2009-02-16 12:00-0800\n"
-"Last-Translator: Apple Inc.\n"
-"Language-Team: Apple Inc.\n"
+"PO-Revision-Date: 2009-02-20 16:43+0900\n"
+"Last-Translator: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
+"Language-Team: OPFC TRANSCUPS <opfc-transcups@sourceforge.jp>\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+
+#: systemv/lpstat.c:1848 systemv/lpstat.c:1961
msgid "\t\t(all)\n"
-msgstr "\t\t(すべて)\n"
+msgstr "\t\t(すべて)\n"
+
+#: systemv/lpstat.c:1851 systemv/lpstat.c:1854 systemv/lpstat.c:1964
+#: systemv/lpstat.c:1967
msgid "\t\t(none)\n"
-msgstr "\t\t(なし)\n"
+msgstr "\t\t(なし)\n"
+
+#: berkeley/lpc.c:438
+#, c-format
msgid "\t%d entries\n"
-msgstr "\t%d エントリ\n"
+msgstr "\t%d エントリー\n"
+
+#: systemv/lpstat.c:1829 systemv/lpstat.c:1942
msgid "\tAfter fault: continue\n"
-msgstr "\t失敗後:継続\n"
+msgstr "\t失敗後: 継続\n"
+
+#: systemv/lpstat.c:1461 systemv/lpstat.c:1795 systemv/lpstat.c:1908
msgid "\tAlerts:"
-msgstr "\tアラート:"
+msgstr "\t警告:"
+
+#: systemv/lpstat.c:1852 systemv/lpstat.c:1965
msgid "\tBanner required\n"
msgstr "\tバナーが必要\n"
+
+#: systemv/lpstat.c:1853 systemv/lpstat.c:1966
msgid "\tCharset sets:\n"
-msgstr "\t文字セット:\n"
+msgstr "\t文字セット:\n"
+
+#: systemv/lpstat.c:1818 systemv/lpstat.c:1931
msgid "\tConnection: direct\n"
-msgstr "\t接続:直結\n"
+msgstr "\t接続: 直結\n"
+
+#: systemv/lpstat.c:1809 systemv/lpstat.c:1922
msgid "\tConnection: remote\n"
-msgstr "\t接続:リモート\n"
+msgstr "\t接続: リモート\n"
+
+#: systemv/lpstat.c:1856 systemv/lpstat.c:1969
msgid "\tDefault page size:\n"
-msgstr "\tデフォルト用紙サイズ:\n"
+msgstr "\tデフォルト用紙サイズ:\n"
+
+#: systemv/lpstat.c:1855 systemv/lpstat.c:1968
msgid "\tDefault pitch:\n"
-msgstr "\tデフォルトピッチ:\n"
+msgstr "\tデフォルトピッチ:\n"
+
+#: systemv/lpstat.c:1857 systemv/lpstat.c:1970
msgid "\tDefault port settings:\n"
-msgstr "\tデフォルトポート設定:\n"
+msgstr "\tデフォルトポート設定:\n"
+
+#: systemv/lpstat.c:1790 systemv/lpstat.c:1903
+#, c-format
msgid "\tDescription: %s\n"
-msgstr "\t説明:%s\n"
-msgid "\tForm mounted:\n\tContent types: any\n\tPrinter types: unknown\n"
-msgstr "\t用紙台:\n\t内容形式:すべて\n\tプリンタ形式:未知\n"
+msgstr "\t説明: %s\n"
+
+#: systemv/lpstat.c:1784 systemv/lpstat.c:1897
+msgid ""
+"\tForm mounted:\n"
+"\tContent types: any\n"
+"\tPrinter types: unknown\n"
+msgstr ""
+"\t設定されたフォーム:\n"
+"\tコンテンツの種類: すべて\n"
+"\tプリンターの種類: 不明\n"
+
+#: systemv/lpstat.c:1850 systemv/lpstat.c:1963
msgid "\tForms allowed:\n"
-msgstr "\t許可されている用紙:\n"
+msgstr "\t許可されているフォーム:\n"
+
+#: systemv/lpstat.c:1813 systemv/lpstat.c:1926
+#, c-format
msgid "\tInterface: %s.ppd\n"
-msgstr "\tインターフェイス:%s.ppd\n"
+msgstr "\tインターフェイス: %s.ppd\n"
+
+#: systemv/lpstat.c:1822 systemv/lpstat.c:1935
+#, c-format
msgid "\tInterface: %s/interfaces/%s\n"
-msgstr "\tインターフェイス:%s/interfaces/%s\n"
+msgstr "\tインターフェイス: %s/interfaces/%s\n"
+
+#: systemv/lpstat.c:1826 systemv/lpstat.c:1939
+#, c-format
msgid "\tInterface: %s/ppd/%s.ppd\n"
-msgstr "\tインターフェイス:%s/ppd/%s.ppd\n"
+msgstr "\tインターフェイス: %s/ppd/%s.ppd\n"
+
+#: systemv/lpstat.c:1804 systemv/lpstat.c:1917
+#, c-format
msgid "\tLocation: %s\n"
-msgstr "\t場所:%s\n"
+msgstr "\t場所: %s\n"
+
+#: systemv/lpstat.c:1828 systemv/lpstat.c:1941
msgid "\tOn fault: no alert\n"
-msgstr "\t失敗時:警告なし\n"
+msgstr "\t失敗時: 警告なし\n"
+
+#: systemv/lpstat.c:1833 systemv/lpstat.c:1847 systemv/lpstat.c:1946
+#: systemv/lpstat.c:1960
msgid "\tUsers allowed:\n"
-msgstr "\t許可されているユーザ:\n"
+msgstr "\t許可されているユーザー:\n"
+
+#: systemv/lpstat.c:1840 systemv/lpstat.c:1953
msgid "\tUsers denied:\n"
-msgstr "\t拒否されているユーザ:\n"
+msgstr "\t拒否されているユーザー:\n"
+
+#: berkeley/lpc.c:440
msgid "\tdaemon present\n"
msgstr "\tデーモンは提供されています\n"
+
+#: berkeley/lpc.c:436
msgid "\tno entries\n"
-msgstr "\tエントリがありません\n"
+msgstr "\tエントリーがありません\n"
+
+#: berkeley/lpc.c:408 berkeley/lpc.c:420
+#, c-format
msgid "\tprinter is on device '%s' speed -1\n"
-msgstr "\tプリンタはデバイス '%s'上。速度 -1\n"
+msgstr "\tデバイス '%s' 上のプリンター 速度 -1\n"
+
+#: berkeley/lpc.c:433
msgid "\tprinting is disabled\n"
msgstr "\t印刷は無効です\n"
+
+#: berkeley/lpc.c:431
msgid "\tprinting is enabled\n"
msgstr "\t印刷は有効です\n"
+
+#: systemv/lpstat.c:1467
+#, c-format
msgid "\tqueued for %s\n"
msgstr "\t%s にキューしました\n"
+
+#: berkeley/lpc.c:428
msgid "\tqueuing is disabled\n"
msgstr "\tキューは無効です\n"
+
+#: berkeley/lpc.c:426
msgid "\tqueuing is enabled\n"
msgstr "\tキューは有効です\n"
+
+#: systemv/lpstat.c:1777 systemv/lpstat.c:1890
msgid "\treason unknown\n"
msgstr "\t未知の理由\n"
-msgid "\n DETAILED CONFORMANCE TEST RESULTS\n"
-msgstr "\n 適合テスト結果詳細\n"
+
+#: systemv/cupstestppd.c:380
+msgid ""
+"\n"
+" DETAILED CONFORMANCE TEST RESULTS\n"
+msgstr ""
+"\n"
+" 適合テスト結果詳細\n"
+
+#: systemv/cupstestppd.c:341 systemv/cupstestppd.c:345
msgid " REF: Page 15, section 3.1.\n"
-msgstr " REF:15 ページ、セクション 3.1。n"
+msgstr " 参照: 15 ページ、セクション 3.1。\n"
+
+#: systemv/cupstestppd.c:337
msgid " REF: Page 15, section 3.2.\n"
-msgstr " REF:15 ページ、セクション 3.2。\n"
+msgstr " 参照: 15 ページ、セクション 3.2。\n"
+
+#: systemv/cupstestppd.c:353
msgid " REF: Page 19, section 3.3.\n"
-msgstr " REF:19 ページ、セクション 3.3。\n"
+msgstr " 参照: 19 ページ、セクション 3.3。\n"
+
+#: systemv/cupstestppd.c:315
msgid " REF: Page 20, section 3.4.\n"
-msgstr " REF:20 ページ、セクション 3.4。\n"
+msgstr " 参照: 20 ページ、セクション 3.4。\n"
+
+#: systemv/cupstestppd.c:357
msgid " REF: Page 27, section 3.5.\n"
-msgstr " REF:27 ページ、セクション 3.5。\n"
+msgstr " 参照: 27 ページ、セクション 3.5。\n"
+
+#: systemv/cupstestppd.c:311
msgid " REF: Page 42, section 5.2.\n"
-msgstr " REF:42 ページ、セクション 5.2。\n"
+msgstr " 参照: 42 ページ、セクション 5.2。\n"
+
+#: systemv/cupstestppd.c:349
msgid " REF: Pages 16-17, section 3.2.\n"
-msgstr " REF:16 〜 17 ページ、セクション 3.2。\n"
+msgstr " 参照: 16-17 ページ、セクション 3.2。\n"
+
+#: systemv/cupstestppd.c:325
msgid " REF: Pages 42-45, section 5.2.\n"
-msgstr " REF:42 〜 45 ページ、セクション 5.2。\n"
+msgstr " 参照: 42-45 ページ、セクション 5.2。\n"
+
+#: systemv/cupstestppd.c:320
msgid " REF: Pages 45-46, section 5.2.\n"
-msgstr " REF:45 〜 46 ページ、セクション 5.2。\n"
+msgstr " 参照: 45-46 ページ、セクション 5.2。\n"
+
+#: systemv/cupstestppd.c:329
msgid " REF: Pages 48-49, section 5.2.\n"
-msgstr " REF:48 〜 49 ページ、セクション 5.2。\n"
+msgstr " 参照: 48-49 ページ、セクション 5.2。\n"
+
+#: systemv/cupstestppd.c:333
msgid " REF: Pages 52-54, section 5.2.\n"
-msgstr " REF:52 〜 54 ページ、セクション 5.2。\n"
+msgstr " 参照: 52-54 ページ、セクション 5.2。\n"
+
+#: berkeley/lpq.c:547
+#, c-format
msgid " %-39.39s %.0f bytes\n"
msgstr " %-39.39s %.0f バイト\n"
+
+#: systemv/cupstestppd.c:497
+#, c-format
msgid " PASS Default%s\n"
msgstr " 合格 Default%s\n"
+
+#: systemv/cupstestppd.c:434
msgid " PASS DefaultImageableArea\n"
msgstr " 合格 DefaultImageableArea\n"
+
+#: systemv/cupstestppd.c:468
msgid " PASS DefaultPaperDimension\n"
msgstr " 合格 DefaultPaperDimension\n"
+
+#: systemv/cupstestppd.c:539
msgid " PASS FileVersion\n"
msgstr " 合格 FileVersion\n"
+
+#: systemv/cupstestppd.c:583
msgid " PASS FormatVersion\n"
msgstr " 合格 FormatVersion\n"
+
+#: systemv/cupstestppd.c:603
msgid " PASS LanguageEncoding\n"
msgstr " 合格 LanguageEncoding\n"
+
+#: systemv/cupstestppd.c:623
msgid " PASS LanguageVersion\n"
msgstr " 合格 LanguageVersion\n"
+
+#: systemv/cupstestppd.c:675
msgid " PASS Manufacturer\n"
msgstr " 合格 Manufacturer\n"
+
+#: systemv/cupstestppd.c:715
msgid " PASS ModelName\n"
msgstr " 合格 ModelName\n"
+
+#: systemv/cupstestppd.c:735
msgid " PASS NickName\n"
msgstr " 合格 NickName\n"
+
+#: systemv/cupstestppd.c:795
msgid " PASS PCFileName\n"
msgstr " 合格 PCFileName\n"
+
+#: systemv/cupstestppd.c:870
msgid " PASS PSVersion\n"
msgstr " 合格 PSVersion\n"
+
+#: systemv/cupstestppd.c:775
msgid " PASS PageRegion\n"
msgstr " 合格 PageRegion\n"
+
+#: systemv/cupstestppd.c:755
msgid " PASS PageSize\n"
msgstr " 合格 PageSize\n"
+
+#: systemv/cupstestppd.c:830
msgid " PASS Product\n"
msgstr " 合格 Product\n"
+
+#: systemv/cupstestppd.c:905
msgid " PASS ShortNickName\n"
msgstr " 合格 ShortNickName\n"
-msgid " WARN \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")\n"
-msgstr " 警告 “%s %s”が“%s %s”と競合します\n (constraint= “%s %s %s %s”)\n"
+
+#: systemv/cupstestppd.c:2861
+#, c-format
+msgid ""
+" WARN \"%s %s\" conflicts with \"%s %s\"\n"
+" (constraint=\"%s %s %s %s\")\n"
+msgstr ""
+" 警告 \"%s %s\" は \"%s %s\" と競合します\n"
+" (禁則=\"%s %s %s %s\")\n"
+
+#: systemv/cupstestppd.c:1270
+#, c-format
msgid " WARN %s has no corresponding options!\n"
-msgstr " 警告 %s に対応するオプションがありません!\n"
-msgid " WARN %s shares a common prefix with %s\n REF: Page 15, section 3.2.\n"
-msgstr " 警告 %s は %s と共通のプレフィックスを共有しています\n REF:15 ページ、セクション 3.2。\n"
+msgstr " 警告 %s は相当するオプションがありません!\n"
+
+#: systemv/cupstestppd.c:1378
+#, c-format
+msgid ""
+" WARN %s shares a common prefix with %s\n"
+" REF: Page 15, section 3.2.\n"
+msgstr ""
+" 警告 %s は %s と一般プレフィックスを共有します。\n"
+" 参照: 15 ページ、セクション 3.2。\n"
+
+#: systemv/cupstestppd.c:1279
msgid " WARN Default choices conflicting!\n"
-msgstr " 警告 デフォルトの選択が競合しています!\n"
-msgid " WARN Duplex option keyword %s may not work as expected and should be named Duplex!\n REF: Page 122, section 5.17\n"
-msgstr " 警告 両面オプションキーワード %s が予期した通りに機能しない可能性があります。Duplex という名前にする必要があります!\n REF:122 ページ、セクション 5.17\n"
+msgstr " 警告 デフォルトの選択肢が競合しています!\n"
+
+#: systemv/cupstestppd.c:1241
+#, c-format
+msgid ""
+" WARN Duplex option keyword %s may not work as expected and should be named Duplex!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" 警告 Duplex オプションキーワード %s は期待通りに動作しないかもしれません。また、 Duplex という名前であるべきです!\n"
+" 参照: 122 ページ、セクション 5.17\n"
+
+#: systemv/cupstestppd.c:1670
msgid " WARN File contains a mix of CR, LF, and CR LF line endings!\n"
-msgstr " 警告 ファイルに CR、LF、CR LF 行末コードが混在しています!\n"
-msgid " WARN LanguageEncoding required by PPD 4.3 spec.\n REF: Pages 56-57, section 5.3.\n"
-msgstr " 警告 PPD 4.3 仕様では LanguageEncoding が必要です。\n REF:56 〜 57 ページ、セクション 5.3。\n"
+msgstr " 警告 ファイルが CR、LF、CR LF の行末を混在して含んでいます!\n"
+
+#: systemv/cupstestppd.c:1295
+msgid ""
+" WARN LanguageEncoding required by PPD 4.3 spec.\n"
+" REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+" 警告 LanguageEncoding は PPD 4.3 仕様で必須です。\n"
+" 参照: 56-57 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:1652
+#, c-format
msgid " WARN Line %d only contains whitespace!\n"
-msgstr " 警告 行 %d に空白しか含まれていません!\n"
-msgid " WARN Manufacturer required by PPD 4.3 spec.\n REF: Pages 58-59, section 5.3.\n"
-msgstr " 警告 PPD 4.3 仕様では Manufacturer が必要です。\n REF:58 〜 59 ページ、セクション 5.3。\n"
+msgstr " 警告 %d 行が空白だけです!\n"
+
+#: systemv/cupstestppd.c:1303
+msgid ""
+" WARN Manufacturer required by PPD 4.3 spec.\n"
+" REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+" 警告 Manufacturer は PPD 4.3 仕様で必須です。\n"
+" 参照: 58-59 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:1397
+#, c-format
msgid " WARN Missing APDialogExtension file \"%s\"\n"
-msgstr " 警告 APDialogExtension ファイル“%s”がありません\n"
+msgstr " 警告 APDialogExtension ファイル \"%s\" が見つかりません\n"
+
+#: systemv/cupstestppd.c:1411
+#, c-format
msgid " WARN Missing APPrinterIconPath file \"%s\"\n"
-msgstr " 警告 APPrinterIconPath ファイル“%s”がありません\n"
+msgstr " 警告 APPrinterIconPath ファイル \"%s\" が見つかりません\n"
+
+#: systemv/cupstestppd.c:1675
msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
-msgstr " 警告 Windows 以外の PPD ファイルでは行末コードとして LF だけを使用する必要があります。CR LF は使用しないでください!\n"
-msgid " WARN Obsolete PPD version %.1f!\n REF: Page 42, section 5.2.\n"
-msgstr " 警告 %.1f は古い PPD バージョンです!\n REF:42 ページ、セクション 5.2。\n"
-msgid " WARN PCFileName longer than 8.3 in violation of PPD spec.\n REF: Pages 61-62, section 5.3.\n"
-msgstr " 警告 8.3 より長い PCFileName は PPD 仕様に違反しています。\n REF:61 〜 62 ページ、セクション 5.3。\n"
-msgid " WARN Protocols contains PJL but JCL attributes are not set.\n REF: Pages 78-79, section 5.7.\n"
-msgstr " 警告 プロトコルに PJL が含まれていますが、JCL 属性が設定されていません。\n REF:78 〜 79 ページ、セクション 5.7。\n"
-msgid " WARN Protocols contains both PJL and BCP; expected TBCP.\n REF: Pages 78-79, section 5.7.\n"
-msgstr " 警告 プロトコルに PJL と BCP の両方が含まれています。TBCP が必要です。\n REF:78 〜 79 ページ、セクション 5.7。\n"
-msgid " WARN ShortNickName required by PPD 4.3 spec.\n REF: Pages 64-65, section 5.3.\n"
-msgstr " 警告 PPD 4.3 仕様では ShortNickName が必要です。\n REF:64 〜 65 ページ、セクション 5.3。\n"
+msgstr " 警告 非 Windows PPD ファイルは、CR LF でなく LF のみを行末に使うべきです!\n"
+
+#: systemv/cupstestppd.c:1287
+#, c-format
+msgid ""
+" WARN Obsolete PPD version %.1f!\n"
+" REF: Page 42, section 5.2.\n"
+msgstr ""
+" 警告 PPD バージョン %.1f は現在使われていません!\n"
+" 参照: 42 ページ、セクション 5.2。\n"
+
+#: systemv/cupstestppd.c:1316
+msgid ""
+" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
+" REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+" 警告 8.3 文字より長い PCFileName は PPD 仕様違反です。\n"
+" 参照: 61-62 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:1350
+msgid ""
+" WARN Protocols contains PJL but JCL attributes are not set.\n"
+" REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+" 警告 プロトコルが PJL を含んでいますが JCL 属性が設定されていません。\n"
+" 参照: 78-79 ページ、セクション 5.7。\n"
+
+#: systemv/cupstestppd.c:1341
+msgid ""
+" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
+" REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+" 警告 プロトコルが PJL と BCP の両方を含んでいます; TBCP を想定します。\n"
+" 参照: 78-79 ページ、セクション 5.7。\n"
+
+#: systemv/cupstestppd.c:1324
+msgid ""
+" WARN ShortNickName required by PPD 4.3 spec.\n"
+" REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+" 警告 ShortNickName は PPD 4.3 仕様で必須です。\n"
+" 参照: 64-65 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:2140
+#, c-format
msgid " %s %s %s does not exist!\n"
-msgstr " %s %s %s が存在しません!\n"
-msgid " %s Bad %s choice %s!\n REF: Page 122, section 5.17\n"
-msgstr " %s %s 選択 %s が正しくありません!\n REF:122 ページ、セクション 5.17\n"
+msgstr " %s %s %s が存在しません!\n"
+
+#: systemv/cupstestppd.c:2210
+#, c-format
+msgid ""
+" %s Bad %s choice %s!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" %s 不正な %s が %s を選んでいます!\n"
+" 参照: 122 ページ、セクション 5.17\n"
+
+#: systemv/cupstestppd.c:2576
+#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n"
-msgstr " %1$s オプション %3$s の UTF-8 “%2$s”変換文字列が正しくありません!\n"
+msgstr " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 用)です!\n"
+
+#: systemv/cupstestppd.c:2622 systemv/cupstestppd.c:2671
+#: systemv/cupstestppd.c:2710
+#, c-format
msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n"
-msgstr " %1$s オプション %3$s、選択 %4$s の UTF-8 “%2$s”変換文字列が正しくありません!\n"
+msgstr " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 、選択 %s)です!\n"
+
+#: systemv/cupstestppd.c:2258
+#, c-format
msgid " %s Bad cupsFilter value \"%s\"!\n"
-msgstr " %s cupsFilter 値“%s”が正しくありません!\n"
+msgstr " %s 不正な値が cupsFilter に設定されています \"%s\"!\n"
+
+#: systemv/cupstestppd.c:2393
+#, c-format
msgid " %s Bad cupsICCProfile %s!\n"
-msgstr " %s cupsICCProfile %s が正しくありません!\n"
+msgstr " %s 不正な cupsICCProfile %sです!\n"
+
+#: systemv/cupstestppd.c:2309
+#, c-format
msgid " %s Bad cupsPreFilter value \"%s\"!\n"
-msgstr " %s cupsPreFilter 値“%s”が正しくありません!\n"
+msgstr " %s 不正な値が cupsPreFilter に設定されています \"%s\"!\n"
+
+#: systemv/cupstestppd.c:1748
+#, c-format
msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n"
-msgstr " %s cupsUIConstraints %s が正しくありません:“%s”!\n"
+msgstr " %s 不正な cupsUIConstraints %s: \"%s\"です!\n"
+
+#: systemv/cupstestppd.c:2526
+#, c-format
msgid " %s Bad language \"%s\"!\n"
-msgstr " %s 言語 “%s”が正しくありません!\n"
+msgstr " %s 無効な言語 \"%s\"です!\n"
+
+#: systemv/cupstestppd.c:1729
+#, c-format
msgid " %s Empty cupsUIConstraints %s!\n"
-msgstr " %s cupsUIConstraints %s が空です!\n"
+msgstr " %s 空の cupsUIConstraints %sです!\n"
+
+#: systemv/cupstestppd.c:2562
+#, c-format
msgid " %s Missing \"%s\" translation string for option %s!\n"
-msgstr " %1$s オプション %3$s の“%2$s”変換文字列が見つかりません!\n"
+msgstr " %s \"%s\" 翻訳文字列 (オプション %s 用) が見つかりません!\n"
+
+#: systemv/cupstestppd.c:2654 systemv/cupstestppd.c:2694
+#, c-format
msgid " %s Missing \"%s\" translation string for option %s, choice %s!\n"
-msgstr " %1$s オプション %3$s、選択 %4$s の“%2$s”変換文字列が見つかりません!\n"
+msgstr " %s \"%s\" 翻訳文字列 (オプション %s 、選択 %s) が見つかりません!\n"
+
+#: systemv/cupstestppd.c:1921 systemv/cupstestppd.c:1962
+#, c-format
msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n"
-msgstr " %s UIConstraints “*%s %s *%s %s”内に選択 *%s %s が見つかりません!\n"
+msgstr " %s 選択 *%s %s が UIConstraints \"*%s %s *%s %s\" 内に見つかりません!\n"
+
+#: systemv/cupstestppd.c:1834
+#, c-format
msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n"
-msgstr " %s cupsUIConstraints %s 内に選択 *%s %s が見つかりません:“%s”!\n"
+msgstr " %s 選択 *%s %s が cupsUIConstraints %s: \"%s\" 内に見つかりません!\n"
+
+#: systemv/cupstestppd.c:2287
+#, c-format
msgid " %s Missing cupsFilter file \"%s\"\n"
-msgstr " %s cupsFilter ファイル“%s”が見つかりません\n"
+msgstr " %s cupsFilter ファイル \"%s\" が見つかりません!\n"
+
+#: systemv/cupstestppd.c:2427
+#, c-format
msgid " %s Missing cupsICCProfile file \"%s\"!\n"
-msgstr " %s cupsICCProfile ファイル“%s”が見つかりません!\n"
+msgstr " %s cupsPreFilter ファイル \"%s\" が見つかりません!\n"
+
+#: systemv/cupstestppd.c:2338
+#, c-format
msgid " %s Missing cupsPreFilter file \"%s\"\n"
-msgstr " %s cupsPreFilter ファイル“%s”が見つかりません\n"
+msgstr " %s cupsPreFilter ファイル \"%s\" が見つかりません!\n"
+
+#: systemv/cupstestppd.c:1766
+#, c-format
msgid " %s Missing cupsUIResolver %s!\n"
-msgstr " %s cupsUIResolver %s が見つかりません!\n"
+msgstr " %s cupsUIResolver ファイル %s が見つかりません!\n"
+
+#: systemv/cupstestppd.c:1907 systemv/cupstestppd.c:1948
+#, c-format
msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n"
-msgstr " %s UIConstraints “*%s %s *%s %s”内にオプション %s が見つかりません!\n"
+msgstr " %s オプション %s がUIConstraints \"*%s %s *%s %s\" に見つかりません!\n"
+
+#: systemv/cupstestppd.c:1818
+#, c-format
msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n"
-msgstr " %s cupsUIConstraints %s内にオプション %s が見つかりません:“%s”!\n"
+msgstr " %s オプション %s がcupsUIConstraints %s に見つかりません!: \"%s\"\n"
+
+#: systemv/cupstestppd.c:2748
+#, c-format
msgid " %s No base translation \"%s\" is included in file!\n"
-msgstr " %s ファイルにベース変換”%s”が取り込まれていません!\n"
-msgid " %s REQUIRED %s does not define choice None!\n REF: Page 122, section 5.17\n"
-msgstr " %s 必須の %s が選択肢 None を定義していません!\n REF:122 ページ、セクション 5.17\n"
+msgstr " %s ファイルにベース翻訳文字列 \"%s\" がありません!\n"
+
+#: systemv/cupstestppd.c:2186
+#, c-format
+msgid ""
+" %s REQUIRED %s does not define choice None!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" %s 必須の %s が選択肢 None を定義していません!\n"
+" 参照: 122 ページ、セクション 5.17\n"
+
+#: systemv/cupstestppd.c:2453
+#, c-format
msgid " %s cupsICCProfile %s hash value collides with %s!\n"
-msgstr " %s cupsICCProfile %s ハッシュ値が %s と衝突しています!\n"
+msgstr " %s cupsICCProfileのハッシュ値 %s が %s と一致しません!\n"
+
+#: systemv/cupstestppd.c:1871
+#, c-format
msgid " %s cupsUIResolver %s causes a loop!\n"
-msgstr " %s cupsUIResolver %s がループになっています!\n"
+msgstr " %s cupsUIResolverの %s がループしています!\n"
+
+#: systemv/cupstestppd.c:2071
+#, c-format
msgid " **FAIL** %s choice names %s and %s differ only by case!\n"
-msgstr " ** 失敗 ** %s 選択名 %s と %s の違いは大文字小文字だけです!\n"
-msgid " **FAIL** %s must be 1284DeviceID!\n REF: Page 72, section 5.5\n"
-msgstr " ** 失敗 ** %s は 1284DeviceID でなければなりません!\n REF:72 ページ、セクション 5.5\n"
-msgid " **FAIL** BAD Default%s %s\n REF: Page 40, section 4.5.\n"
-msgstr " ** 失敗 ** Default%s %s が正しくありません\n REF:40 ページ、セクション 4.5。\n"
-msgid " **FAIL** BAD DefaultImageableArea %s!\n REF: Page 102, section 5.15.\n"
-msgstr " ** 失敗 ** DefaultImageableArea %s が正しくありません!\n REF:102 ページ、セクション 5.15。\n"
-msgid " **FAIL** BAD DefaultPaperDimension %s!\n REF: Page 103, section 5.15.\n"
-msgstr " ** 失敗 ** DefaultPaperDimension %s が正しくありません!\n REF:103 ページ、セクション 5.15。\n"
-msgid " **FAIL** BAD JobPatchFile attribute in file\n REF: Page 24, section 3.4.\n"
-msgstr " ** 失敗 ** ファイル内の JobPatchFile 属性が正しくありません\n REF:24 ページ、セクション 3.4。\n"
-msgid " **FAIL** BAD Manufacturer (should be \"HP\")\n REF: Page 211, table D.1.\n"
-msgstr " ** 失敗 ** Manufacturer が正しくありません(“HP”でなければなりません)\n REF:211 ページ、表 D.1。\n"
-msgid " **FAIL** BAD Manufacturer (should be \"Oki\")\n REF: Page 211, table D.1.\n"
-msgstr " ** 失敗 ** Manufacturer が正しくありません(“Oki”でなければなりません)\n REF:211 ページ、表 D.1。\n"
-msgid " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3.\n"
-msgstr " ** 失敗 ** ModelName が正しくありません - “%c”は文字列内で許可されません。\n REF:59 〜 60 ページ、セクション 5.3。\n"
-msgid " **FAIL** BAD PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3.\n"
-msgstr " ** 失敗 ** PSVersion が正しくありません - “(文字列) 正数”でありません。\n REF:62 〜 64 ページ、セクション 5.3。\n"
-msgid " **FAIL** BAD Product - not \"(string)\".\n REF: Page 62, section 5.3.\n"
-msgstr " ** 失敗 ** Product が正しくありません - “(文字列)”でありません。\n REF:62 ページ、セクション 5.3。\n"
-msgid " **FAIL** BAD ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3.\n"
-msgstr " ** 失敗 ** ShortNickName が正しくありません - 31 文字より長いです。\n REF:64 〜 65 ページ、セクション 5.3。\n"
-msgid " **FAIL** Bad %s choice %s!\n REF: Page 84, section 5.9\n"
-msgstr " ** 失敗 ** %s 選択 %s が正しくありません!\n REF:84 ページ、セクション 5.9\n"
-msgid " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3.\n"
-msgstr " ** 失敗 ** FileVersion “%s” が正しくありません\n REF:56 ページ、セクション 5.3。\n"
-msgid " **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3.\n"
-msgstr " ** 失敗 ** FormatVersion “%s” が正しくありません\n REF:56 ページ、セクション 5.3。\n"
+msgstr " **失敗** %s が選択した %s と %s は大文字/小文字のみが違うだけです!\n"
+
+#: systemv/cupstestppd.c:1072
+#, c-format
+msgid ""
+" **FAIL** %s must be 1284DeviceID!\n"
+" REF: Page 72, section 5.5\n"
+msgstr ""
+" **失敗** %s は 1284DeviceID でなければなりません!\n"
+" 参照: 72 ページ、セクション 5.5\n"
+
+#: systemv/cupstestppd.c:488
+#, c-format
+msgid ""
+" **FAIL** BAD Default%s %s\n"
+" REF: Page 40, section 4.5.\n"
+msgstr ""
+" **失敗** 不正な Default%s %s\n"
+" 参照: 40 ページ、セクション 4.5。\n"
+
+#: systemv/cupstestppd.c:424
+#, c-format
+msgid ""
+" **FAIL** BAD DefaultImageableArea %s!\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **失敗** %s は不正な DefaultImageableArea です!\n"
+" 参照: 102 ページ、セクション 5.15。\n"
+
+#: systemv/cupstestppd.c:460
+#, c-format
+msgid ""
+" **FAIL** BAD DefaultPaperDimension %s!\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **失敗** %s は不正な DefaultPaperDimension です!\n"
+" 参照: 103 ページ、セクション 5.15。\n"
+
+#: systemv/cupstestppd.c:931
+msgid ""
+" **FAIL** BAD JobPatchFile attribute in file\n"
+" REF: Page 24, section 3.4.\n"
+msgstr ""
+" **失敗** ファイルに不正な JobPatchFile 属性があります\n"
+" 参照: 24 ページ、セクション 3.4。\n"
+
+#: systemv/cupstestppd.c:651
+msgid ""
+" **FAIL** BAD Manufacturer (should be \"HP\")\n"
+" REF: Page 211, table D.1.\n"
+msgstr ""
+" **失敗** 不正な Manufacturer (\"HP\" でなければなりません)\n"
+" 参照: 211 ページ、表 D.1。\n"
+
+#: systemv/cupstestppd.c:667
+msgid ""
+" **FAIL** BAD Manufacturer (should be \"Oki\")\n"
+" REF: Page 211, table D.1.\n"
+msgstr ""
+" **失敗** 不正な Manufacturer (\"Oki\" でなければなりません)\n"
+" 参照: 211 ページ、表 D.1。\n"
+
+#: systemv/cupstestppd.c:706
+#, c-format
+msgid ""
+" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n"
+" REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+" **失敗** 不正な ModelName - 文字列に \"%c\" は許可されていません。\n"
+" 参照: 59-60 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:862
+msgid ""
+" **FAIL** BAD PSVersion - not \"(string) int\".\n"
+" REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+" **失敗** 不正な PSVersion - \"(文字列) 整数\" ではありません。\n"
+" 参照: 62-64 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:823
+msgid ""
+" **FAIL** BAD Product - not \"(string)\".\n"
+" REF: Page 62, section 5.3.\n"
+msgstr ""
+" **失敗** 不正な Product - \"(文字列)\" ではありません。\n"
+" 参照: 62 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:897
+msgid ""
+" **FAIL** BAD ShortNickName - longer than 31 chars.\n"
+" REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+" **失敗** 不正な ShortNickName - 31 文字を超えています。\n"
+" 参照: 64-65 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:1053
+#, c-format
+msgid ""
+" **FAIL** Bad %s choice %s!\n"
+" REF: Page 84, section 5.9\n"
+msgstr ""
+" **失敗** 不正な %s が %s を選んでいます!\n"
+" 参照: 84 ページ、セクション 5.9\n"
+
+#: systemv/cupstestppd.c:531
+#, c-format
+msgid ""
+" **FAIL** Bad FileVersion \"%s\"\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **失敗** 不正なFileVersion \"%s\"\n"
+" 参照: 56 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:575
+#, c-format
+msgid ""
+" **FAIL** Bad FormatVersion \"%s\"\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **失敗** FormatVersion が違います \"%s\"\n"
+" 参照: 56 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:1114
+#, c-format
msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n"
-msgstr " ** 失敗 ** LanguageEncoding %s が正しくありません - ISOLatin1 でなければなりません!\n"
+msgstr " **失敗** 無効な LanguageEncoding %s - ISOLatin1 でなければなりません!\n"
+
+#: systemv/cupstestppd.c:1128
+#, c-format
msgid " **FAIL** Bad LanguageVersion %s - must be English!\n"
-msgstr " ** 失敗 ** LanguageVersion %s が正しくありません - English でなければなりません!\n"
+msgstr " **失敗** 無効な LanguageVersion %s - English でなければなりません!\n"
+
+#: systemv/cupstestppd.c:2888 systemv/cupstestppd.c:2910
+#, c-format
msgid " **FAIL** Default option code cannot be interpreted: %s\n"
-msgstr " ** 失敗 ** デフォルトのオプションコードを解釈できません:%s\n"
+msgstr " **失敗** デフォルトのオプションコードが解釈できません: %s\n"
+
+#: systemv/cupstestppd.c:1187
+#, c-format
msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters!\n"
-msgstr " ** 失敗 ** オプション %s 選択 %s のデフォルト変換文字列に 8 ビット文字が含まれています!\n"
+msgstr " **失敗** オプション %s、選択 %s のデフォルトの翻訳文字列が 8 ビット文字を含んでいます!\n"
+
+#: systemv/cupstestppd.c:1160
+#, c-format
msgid " **FAIL** Default translation string for option %s contains 8-bit characters!\n"
-msgstr " ** 失敗 ** オプション %s のデフォルト変換文字列に 8 ビット文字が含まれています!\n"
+msgstr " **失敗** オプション %s のデフォルトの翻訳文字列が 8 ビット文字を含んでいます!\n"
+
+#: systemv/cupstestppd.c:2009
+#, c-format
msgid " **FAIL** Group names %s and %s differ only by case!\n"
-msgstr " ** 失敗 ** グループ名 %s と %s の違いは大文字小文字だけです!\n"
+msgstr " **失敗** グループ名 %s と %s は大文字/小文字が違うだけです!\n"
+
+#: systemv/cupstestppd.c:2054
+#, c-format
msgid " **FAIL** Multiple occurrences of %s choice name %s!\n"
-msgstr " ** 失敗 ** %s 選択名 %s が複数回出現します!\n"
+msgstr " **失敗** %s で複数のオプション %s が選択されています!\n"
+
+#: systemv/cupstestppd.c:2031
+#, c-format
msgid " **FAIL** Option names %s and %s differ only by case!\n"
-msgstr " ** 失敗 ** オプション名 %s と %s の違いは大文字小文字だけです!\n"
-msgid " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5.\n"
-msgstr " ** 失敗 ** Default%s が必要です\n REF:40 ページ、セクション 4.5。\n"
-msgid " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15.\n"
-msgstr " ** 失敗 ** DefaultImageableArea が必要です\n REF:102 ページ、セクション 5.15。\n"
-msgid " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15.\n"
-msgstr " ** 失敗 ** DefaultPaperDimension が必要です\n REF:103 ページ、セクション 5.15。\n"
-msgid " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3.\n"
-msgstr " ** 失敗 ** FileVersion が必要です\n REF:56 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3.\n"
-msgstr " ** 失敗 ** FormatVersion が必要です\n REF:56 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15.\n"
-msgstr " ** 失敗 ** PageSize %s に ImageableArea が必要です\n REF:41 ページ、セクション 5。\n REF:102 ページ、セクション 5.15。\n"
-msgid " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3.\n"
-msgstr " ** 失敗 ** LanguageEncoding が必要です\n REF:56 〜 57 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3.\n"
-msgstr " ** 失敗 ** LanguageVersion が必要です\n REF:57 〜 58 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3.\n"
-msgstr " ** 失敗 ** Manufacturer が必要です\n REF:58 〜 59 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3.\n"
-msgstr " ** 失敗 ** ModelName が必要です\n REF:59 〜 60 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3.\n"
-msgstr " ** 失敗 ** NickName が必要です\n REF:60 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3.\n"
-msgstr " ** 失敗 ** PCFileName が必要です\n REF:61 〜 62 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3.\n"
-msgstr " ** 失敗 ** PSVersion が必要です\n REF:62 〜 64 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14.\n"
-msgstr " ** 失敗 ** PageRegion が必要です\n REF:100 ページ、セクション 5.14。\n"
-msgid " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14.\n"
-msgstr " ** 失敗 ** PageSize が必要です\n REF:41 ページ、セクション 5。\n REF:99 ページ、セクション 5.14。\n"
-msgid " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14.\n"
-msgstr " ** 失敗 ** PageSize が必要です\n REF:99 〜 100 ページ、セクション 5.14。\n"
-msgid " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15.\n"
-msgstr " ** 失敗 ** PageSize %s に PaperDimension が必要です\n REF:41 ページ、セクション 5。\n REF:103 ページ、セクション 5.15。\n"
-msgid " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3.\n"
-msgstr " ** 失敗 ** Product が必要です\n REF:62 ページ、セクション 5.3。\n"
-msgid " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3.\n"
-msgstr " ** 失敗 ** ShortNickName が必要です\n REF:64 〜 65 ページ、セクション 5.3。\n"
+msgstr " **失敗** オプション名 %s と %s は大文字/小文字が違うだけです!\n"
+
+#: systemv/cupstestppd.c:508
+#, c-format
+msgid ""
+" **FAIL** REQUIRED Default%s\n"
+" REF: Page 40, section 4.5.\n"
+msgstr ""
+" **失敗** Default%s は必須\n"
+" 参照: 40 ページ、セクション 4.5。\n"
+
+#: systemv/cupstestppd.c:409
+msgid ""
+" **FAIL** REQUIRED DefaultImageableArea\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **失敗** DefaultImageableArea は必須\n"
+" 参照: 102 ページ、セクション 5.15。\n"
+
+#: systemv/cupstestppd.c:445
+msgid ""
+" **FAIL** REQUIRED DefaultPaperDimension\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **失敗** DefaultPaperDimension は必須\n"
+" 参照: 103 ページ、セクション 5.15。\n"
+
+#: systemv/cupstestppd.c:549
+msgid ""
+" **FAIL** REQUIRED FileVersion\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **失敗** FileVersion は必須\n"
+" 参照: 56 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:593
+msgid ""
+" **FAIL** REQUIRED FormatVersion\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **失敗** FormatVersion は必須\n"
+" 参照: 56 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:982
+#, c-format
+msgid ""
+" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **失敗** PageSize %s に ImageableArea は必須\n"
+" 参照: 41 ページ、セクション 5。\n"
+" 参照: 102 ページ、セクション 5.15。\n"
+
+#: systemv/cupstestppd.c:613
+msgid ""
+" **FAIL** REQUIRED LanguageEncoding\n"
+" REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+" **失敗** LanguageEncoding は必須\n"
+" 参照: 56-57 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:633
+msgid ""
+" **FAIL** REQUIRED LanguageVersion\n"
+" REF: Pages 57-58, section 5.3.\n"
+msgstr ""
+" **失敗** LanguageVersion は必須\n"
+" 参照: 57-58 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:685
+msgid ""
+" **FAIL** REQUIRED Manufacturer\n"
+" REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+" **失敗** Manufacturer は必須\n"
+" 参照: 58-59 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:725
+msgid ""
+" **FAIL** REQUIRED ModelName\n"
+" REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+" **失敗** ModelName は必須\n"
+" 参照: 59-60 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:745
+msgid ""
+" **FAIL** REQUIRED NickName\n"
+" REF: Page 60, section 5.3.\n"
+msgstr ""
+" **失敗** NickName は必須\n"
+" 参照: 60 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:805
+msgid ""
+" **FAIL** REQUIRED PCFileName\n"
+" REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+" **失敗** PCFileName は必須\n"
+" 参照: 61-62 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:880
+msgid ""
+" **FAIL** REQUIRED PSVersion\n"
+" REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+" **失敗** PSVersion は必須\n"
+" 参照: 62-64 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:785
+msgid ""
+" **FAIL** REQUIRED PageRegion\n"
+" REF: Page 100, section 5.14.\n"
+msgstr ""
+" **失敗** PageRegion は必須\n"
+" 参照: 100 ページ、セクション 5.14。\n"
+
+#: systemv/cupstestppd.c:951
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 99, section 5.14.\n"
+msgstr ""
+" **失敗** PageSize は必須\n"
+" 参照: 41 ページ、セクション 5。\n"
+" 参照: 99 ページ、セクション 5.14。\n"
+
+#: systemv/cupstestppd.c:765
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Pages 99-100, section 5.14.\n"
+msgstr ""
+" **失敗** PageSize は必須\n"
+" 参照: 99-100 ページ、セクション 5.14。\n"
+
+#: systemv/cupstestppd.c:1004
+#, c-format
+msgid ""
+" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **失敗** PageSize %s に PaperDimension は必須\n"
+" 参照: 41 ページ、セクション 5。\n"
+" 参照: 103 ページ、セクション 5.15。\n"
+
+#: systemv/cupstestppd.c:840
+msgid ""
+" **FAIL** REQUIRED Product\n"
+" REF: Page 62, section 5.3.\n"
+msgstr ""
+" **失敗** Product は必須\n"
+" 参照: 62 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:915
+msgid ""
+" **FAIL** REQUIRED ShortNickName\n"
+" REF: Page 64-65, section 5.3.\n"
+msgstr ""
+" **失敗** ShortNickName は必須\n"
+" 参照: 64-65 ページ、セクション 5.3。\n"
+
+#: systemv/cupstestppd.c:1420
+#, c-format
msgid " %d ERRORS FOUND\n"
msgstr " %d 個のエラーが見つかりました\n"
-msgid " Bad %%%%BoundingBox: on line %d!\n REF: Page 39, %%%%BoundingBox:\n"
-msgstr " %%%%BoundingBox が正しくありません:行 %d!\n REF:39 ページ、%%%%BoundingBox:\n"
-msgid " Bad %%%%Page: on line %d!\n REF: Page 53, %%%%Page:\n"
-msgstr " %%%%Page が正しくありません:行 %d!\n REF:53 ページ、%%%%Page:\n"
-msgid " Bad %%%%Pages: on line %d!\n REF: Page 43, %%%%Pages:\n"
-msgstr " %%%%Pages が正しくありません:行 %d!\n REF:43 ページ、%%%%Pages:\n"
-msgid " Line %d is longer than 255 characters (%d)!\n REF: Page 25, Line Length\n"
-msgstr " %d 行が 255 文字より長くなっています(%d)!\n REF:25 ページ、Line Length\n"
-msgid " Missing %!PS-Adobe-3.0 on first line!\n REF: Page 17, 3.1 Conforming Documents\n"
-msgstr " 先頭行に %!PS-Adobe-3.0 がありません!\n REF:17 ページ、3.1 Conforming Documents\n"
-msgid " Missing %%EndComments comment!\n REF: Page 41, %%EndComments\n"
-msgstr " %%EndComments コメントが見つかりません!\n REF:41 ページ、%%EndComments\n"
-msgid " Missing or bad %%BoundingBox: comment!\n REF: Page 39, %%BoundingBox:\n"
-msgstr " %%BoundingBox が見つからないか正しくありません:コメント!\n REF:39 ページ、%%BoundingBox:\n"
-msgid " Missing or bad %%Page: comments!\n REF: Page 53, %%Page:\n"
-msgstr " %%Page が見つからないか正しくありません:コメント!\n REF:53 ページ、%%Page:\n"
-msgid " Missing or bad %%Pages: comment!\n REF: Page 43, %%Pages:\n"
-msgstr " %%Pages が見つからないか正しくありません:コメント!\n REF:43 ページ、%%Pages:\n"
+
+#: systemv/cupstestdsc.c:238 systemv/cupstestdsc.c:280
+#, c-format
+msgid ""
+" Bad %%%%BoundingBox: on line %d!\n"
+" REF: Page 39, %%%%BoundingBox:\n"
+msgstr ""
+" 不正な %%%%BoundingBox: (%d 行)!\n"
+" 参照: 39 ページ、%%%%BoundingBox:\n"
+
+#: systemv/cupstestdsc.c:309
+#, c-format
+msgid ""
+" Bad %%%%Page: on line %d!\n"
+" REF: Page 53, %%%%Page:\n"
+msgstr ""
+" 不正な %%%%Page: (%d 行)!\n"
+" 参照: 53 ページ、%%%%Page:\n"
+
+#: systemv/cupstestdsc.c:222 systemv/cupstestdsc.c:262
+#, c-format
+msgid ""
+" Bad %%%%Pages: on line %d!\n"
+" REF: Page 43, %%%%Pages:\n"
+msgstr ""
+" 不正な %%%%Pages: (%d 行)!\n"
+" 参照: 43 ページ、%%%%Pages:\n"
+
+#: systemv/cupstestdsc.c:180
+#, c-format
+msgid ""
+" Line %d is longer than 255 characters (%d)!\n"
+" REF: Page 25, Line Length\n"
+msgstr ""
+" %d 行が 255文字より長くなっています (%d)!\n"
+" 参照: 25 ページ、Line Length\n"
+
+#: systemv/cupstestdsc.c:196
+msgid ""
+" Missing %!PS-Adobe-3.0 on first line!\n"
+" REF: Page 17, 3.1 Conforming Documents\n"
+msgstr ""
+" 先頭行に %!PS-Adobe-3.0 がありません!\n"
+" 参照: 17 ページ、3.1 Conforming Documents\n"
+
+#: systemv/cupstestdsc.c:366
+#, c-format
+msgid ""
+" Missing %%EndComments comment!\n"
+" REF: Page 41, %%EndComments\n"
+msgstr ""
+" %%EndComments コメントが見つかりません!\n"
+" 参照: 41 ページ、%%EndComments\n"
+
+#: systemv/cupstestdsc.c:346
+#, c-format
+msgid ""
+" Missing or bad %%BoundingBox: comment!\n"
+" REF: Page 39, %%BoundingBox:\n"
+msgstr ""
+" %%BoundingBox: コメントが見つからないか不正です!\n"
+" 参照: 39 ページ、%%BoundingBox:\n"
+
+#: systemv/cupstestdsc.c:376
+#, c-format
+msgid ""
+" Missing or bad %%Page: comments!\n"
+" REF: Page 53, %%Page:\n"
+msgstr ""
+" %%Page: コメントが見つからないか不正です!\n"
+" 参照: 53 ページ、%%Page:\n"
+
+#: systemv/cupstestdsc.c:356
+#, c-format
+msgid ""
+" Missing or bad %%Pages: comment!\n"
+" REF: Page 43, %%Pages:\n"
+msgstr ""
+" %%Pages: コメントが見つからないか不正です!\n"
+" 参照: 43 ページ、%%Pages:\n"
+
+#: systemv/cupstestppd.c:1422
msgid " NO ERRORS FOUND\n"
-msgstr " エラーが見つかりませんでした\n"
+msgstr " エラーは見つかりませんでした\n"
+
+#: systemv/cupstestdsc.c:399
+#, c-format
msgid " Saw %d lines that exceeded 255 characters!\n"
-msgstr " 255 文字を超える行が %d 個ありました!\n"
+msgstr " 255文字を超える %d 行が見つかりました!\n"
+
+#: systemv/cupstestdsc.c:394
+#, c-format
msgid " Too many %%BeginDocument comments!\n"
-msgstr " %%BeginDocument コメントが多すぎます!\n"
+msgstr " %%BeginDocument コメントが多すぎます!\n"
+
+#: systemv/cupstestdsc.c:386
+#, c-format
msgid " Too many %%EndDocument comments!\n"
-msgstr " %%EndDocument コメントが多すぎます!\n"
+msgstr " %%EndDocument コメントが多すぎます!\n"
+
+#: systemv/cupstestdsc.c:406
msgid " Warning: file contains binary data!\n"
-msgstr " 警告:ファイル内にバイナリデータが含まれています!\n"
+msgstr " 警告: ファイルにバイナリデータが含まれています!\n"
+
+#: systemv/cupstestdsc.c:414
+#, c-format
msgid " Warning: no %%EndComments comment in file!\n"
-msgstr " 警告:ファイル内に %%EndComments コメントがありません!\n"
+msgstr " 警告: ファイルに %%EndComments コメントがありません!\n"
+
+#: systemv/cupstestdsc.c:410
+#, c-format
msgid " Warning: obsolete DSC version %.1f in file!\n"
-msgstr " 警告:ファイル内に古い DSC バージョン %.1f があります!\n"
+msgstr " 警告: ファイルは時代遅れの DSC バージョン %.1f です!\n"
+
+#: systemv/cupstestppd.c:406 systemv/cupstestppd.c:421
+#: systemv/cupstestppd.c:442 systemv/cupstestppd.c:457
+#: systemv/cupstestppd.c:485 systemv/cupstestppd.c:505
+#: systemv/cupstestppd.c:528 systemv/cupstestppd.c:546
+#: systemv/cupstestppd.c:572 systemv/cupstestppd.c:590
+#: systemv/cupstestppd.c:610 systemv/cupstestppd.c:630
+#: systemv/cupstestppd.c:648 systemv/cupstestppd.c:664
+#: systemv/cupstestppd.c:682 systemv/cupstestppd.c:703
+#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:742
+#: systemv/cupstestppd.c:762 systemv/cupstestppd.c:782
+#: systemv/cupstestppd.c:802 systemv/cupstestppd.c:820
+#: systemv/cupstestppd.c:837 systemv/cupstestppd.c:859
+#: systemv/cupstestppd.c:877 systemv/cupstestppd.c:894
+#: systemv/cupstestppd.c:912 systemv/cupstestppd.c:928
+#: systemv/cupstestppd.c:948 systemv/cupstestppd.c:979
+#: systemv/cupstestppd.c:1001 systemv/cupstestppd.c:1050
+#: systemv/cupstestppd.c:1069 systemv/cupstestppd.c:1110
+#: systemv/cupstestppd.c:1124 systemv/cupstestppd.c:1156
+#: systemv/cupstestppd.c:1183 systemv/cupstestppd.c:1726
+#: systemv/cupstestppd.c:1745 systemv/cupstestppd.c:1763
+#: systemv/cupstestppd.c:1815 systemv/cupstestppd.c:1831
+#: systemv/cupstestppd.c:1868 systemv/cupstestppd.c:1904
+#: systemv/cupstestppd.c:1918 systemv/cupstestppd.c:1945
+#: systemv/cupstestppd.c:1959 systemv/cupstestppd.c:2005
+#: systemv/cupstestppd.c:2027 systemv/cupstestppd.c:2050
+#: systemv/cupstestppd.c:2067 systemv/cupstestppd.c:2136
+#: systemv/cupstestppd.c:2183 systemv/cupstestppd.c:2207
+#: systemv/cupstestppd.c:2254 systemv/cupstestppd.c:2284
+#: systemv/cupstestppd.c:2305 systemv/cupstestppd.c:2335
+#: systemv/cupstestppd.c:2389 systemv/cupstestppd.c:2424
+#: systemv/cupstestppd.c:2449 systemv/cupstestppd.c:2522
+#: systemv/cupstestppd.c:2558 systemv/cupstestppd.c:2572
+#: systemv/cupstestppd.c:2618 systemv/cupstestppd.c:2650
+#: systemv/cupstestppd.c:2667 systemv/cupstestppd.c:2690
+#: systemv/cupstestppd.c:2706 systemv/cupstestppd.c:2744
+#: systemv/cupstestppd.c:2884 systemv/cupstestppd.c:2906
msgid " FAIL\n"
msgstr " 失敗\n"
-msgid " FAIL\n **FAIL** Unable to open PPD file - %s\n"
-msgstr " 失敗\n ** 失敗 ** PPD ファイルを開けません - %s\n"
-msgid " FAIL\n **FAIL** Unable to open PPD file - %s on line %d.\n"
-msgstr " 失敗\n ** 失敗 ** PPD ファイルを開けません - %s、行 %d\n"
+
+#: systemv/cupstestppd.c:291
+#, c-format
+msgid ""
+" FAIL\n"
+" **FAIL** Unable to open PPD file - %s\n"
+msgstr ""
+" 失敗\n"
+" **失敗** PPD ファイルを開けません - %s\n"
+
+#: systemv/cupstestppd.c:302
+#, c-format
+msgid ""
+" FAIL\n"
+" **FAIL** Unable to open PPD file - %s on line %d.\n"
+msgstr ""
+" 失敗\n"
+" **失敗** PPD ファイルを開けません - %s (%d 行)。\n"
+
+#: systemv/cupstestppd.c:1207
msgid " PASS\n"
msgstr " 合格\n"
+
+#: ppdc/sample.c:51
msgid "#10 Envelope"
msgstr "#10 封筒"
+
+#: ppdc/sample.c:52
msgid "#11 Envelope"
msgstr "#11 封筒"
+
+#: ppdc/sample.c:53
msgid "#12 Envelope"
msgstr "#12 封筒"
+
+#: ppdc/sample.c:54
msgid "#14 Envelope"
msgstr "#14 封筒"
+
+#: ppdc/sample.c:55
msgid "#9 Envelope"
msgstr "#9 封筒"
+
+#: berkeley/lpq.c:553
+#, c-format
msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f バイト\n"
+
+#: berkeley/lpq.c:558
+#, c-format
msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
msgstr "%-7s %-7.7s %-7d %-31.31s %.0f バイト\n"
+
+#: filter/bannertops.c:780
+#, c-format
msgid "%.0f x %.0f millimeters"
msgstr "%.0f x %.0f ミリメートル"
+
+#: filter/bannertops.c:801
+#, c-format
msgid "%.0f x %.0f to %.0f x %.0f millimeters"
-msgstr "%.0f x %.0f 〜 %.0f x %.0f ミリメートル"
+msgstr "%.0f x %.0f to %.0f x %.0f ミリメートル"
+
+#: filter/bannertops.c:771
+#, c-format
msgid "%.2f x %.2f inches"
msgstr "%.2f x %.2f インチ"
+
+#: filter/bannertops.c:790
+#, c-format
msgid "%.2f x %.2f to %.2f x %.2f inches"
-msgstr "%.2f x %.2f 〜 %.2f x %.2f インチ"
+msgstr "%.2f x %.2f to %.2f x %.2f インチ"
+
+#: systemv/lpstat.c:754
+#, c-format
msgid "%s accepting requests since %s\n"
-msgstr "%s は 以降の要求を受け入れ中 -\n\t%s\n"
+msgstr "%s は %s からリクエストを受け付けています\n"
+
+#: scheduler/ipp.c:10466
+#, c-format
msgid "%s cannot be changed."
-msgstr "%s を変更できません。"
+msgstr "%s は変更できません。"
+
+#: berkeley/lpc.c:194
+#, c-format
msgid "%s is not implemented by the CUPS version of lpc.\n"
-msgstr "%s は CUPS 版の lpc では実装されていません。\n"
+msgstr "%s は lpc の CUPS バージョンでは実装されていません。\n"
+
+#: berkeley/lpq.c:644
+#, c-format
msgid "%s is not ready\n"
msgstr "%s は準備ができていません\n"
+
+#: berkeley/lpq.c:637
+#, c-format
msgid "%s is ready\n"
msgstr "%s は準備ができています\n"
+
+#: berkeley/lpq.c:640
+#, c-format
msgid "%s is ready and printing\n"
-msgstr "%s は準備ができていてプリント中です\n"
-msgid "%s not accepting requests since %s -\n\t%s\n"
-msgstr "%s は %s 以降の要求を受け入れません -\n\t%s\n"
+msgstr "%s は準備ができており印刷しています\n"
+
+#: systemv/lpstat.c:757
+#, c-format
+msgid ""
+"%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s は %s からリクエストを受け付けていません\n"
+"\t%s\n"
+
+#: scheduler/ipp.c:689
+#, c-format
msgid "%s not supported!"
-msgstr "%s には対応していません!"
+msgstr "%s はサポートされていません!"
+
+#: systemv/lpstat.c:767
+#, c-format
msgid "%s/%s accepting requests since %s\n"
-msgstr "%s/%s は であるため要求を受け入れ中 -\n\t%s\n"
-msgid "%s/%s not accepting requests since %s -\n\t%s\n"
-msgstr "%s/%s は %s 以降の要求を受け入れません -\n\t%s\n"
+msgstr "%s/%s は %s からリクエストを受け付けています\n"
+
+#: systemv/lpstat.c:770
+#, c-format
+msgid ""
+"%s/%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s は %s からリクエストを受け付けていません\n"
+"\t%s\n"
+
+#: berkeley/lpq.c:545
+#, c-format
msgid "%s: %-33.33s [job %d localhost]\n"
-msgstr "%s:%-33.33s [ジョブ %d localhost]\n"
+msgstr "%s:%-33.33s [ジョブ %d localhost]\n"
+
+#: systemv/cancel.c:303 systemv/cancel.c:367
+#, c-format
msgid "%s: %s failed: %s\n"
-msgstr "%s:%s が失敗しました:%s\n"
+msgstr "%s: %s に失敗しました: %s\n"
+
+#: systemv/cupsaccept.c:73
+#, c-format
msgid "%s: Don't know what to do!\n"
-msgstr "%s:対処方法が不明です!\n"
+msgstr "%s: 何が起きているか不明です!\n"
+
+#: berkeley/lpr.c:356 systemv/lp.c:603
+#, c-format
msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr "%s:エラー - %s 環境変数名に存在しない送信先“%s”が指定されています!\n"
+msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています!\n"
+
+#: systemv/lp.c:240
+#, c-format
msgid "%s: Error - bad job ID!\n"
-msgstr "%s:エラー - ジョブ ID が正しくありません!\n"
+msgstr "%s: エラー - 不正なジョブ ID です!\n"
+
+#: systemv/lp.c:227
+#, c-format
msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
-msgstr "%s:エラー - ファイルのプリントとジョブの変更を同時にすることはできません!\n"
+msgstr "%s: エラー - ファイルを印刷できず、ジョブを同時に変えることができません!\n"
+
+#: systemv/lp.c:523
+#, c-format
msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
-msgstr "%s:エラー - ファイルまたはジョブ ID が渡される場合は stdin からプリントできません!\n"
+msgstr "%s: エラー - ファイルまたはジョブ ID が提供されている場合、標準入力から印刷できません。 \n"
+
+#: systemv/lp.c:477
+#, c-format
msgid "%s: Error - expected character set after '-S' option!\n"
-msgstr "%s:エラー - ‘-S’オプションの後に文字セットが必要です!\n"
+msgstr "%s: エラー - '-S' オプションのあとには文字セットが必要です!\n"
+
+#: systemv/lp.c:497
+#, c-format
msgid "%s: Error - expected content type after '-T' option!\n"
-msgstr "%s:エラー - ‘-T’オプションの後にコンテンツタイプが必要です!\n"
+msgstr "%s: エラー - '-T' オプションのあとにはコンテンツタイプが必要です!\n"
+
+#: systemv/lp.c:273
+#, c-format
msgid "%s: Error - expected copies after '-n' option!\n"
-msgstr "%s:エラー - ‘-n’オプションの後に部数が必要です!\n"
+msgstr "%s: エラー - '-n' オプションのあとにはコピー数が必要です!\n"
+
+#: berkeley/lpr.c:251
+#, c-format
msgid "%s: Error - expected copy count after '-#' option!\n"
-msgstr "%s:エラー - ‘-#’オプションの後に部数が必要です!\n"
+msgstr "%s: エラー - '-#' オプションのあとにはコピー数が必要です!\n"
+
+#: berkeley/lpr.c:219
+#, c-format
msgid "%s: Error - expected destination after '-P' option!\n"
-msgstr "%s:エラー - ‘-P’オプションの後に送信先が必要です!\n"
+msgstr "%s: エラー - '-P' オプションのあとには宛先が必要です!\n"
+
+#: systemv/lpstat.c:238
+#, c-format
msgid "%s: Error - expected destination after '-b' option!\n"
-msgstr "%s:エラー - ‘-b’オプションの後に送信先が必要です!\n"
+msgstr "%s: エラー - '-b' オプションのあとに宛先が必要です!\n"
+
+#: systemv/lp.c:145
+#, c-format
msgid "%s: Error - expected destination after '-d' option!\n"
-msgstr "%s:エラー - ‘-d’オプションの後に送信先が必要です!\n"
+msgstr "%s: エラー - '-d' オプションのあとにはプリンター名が必要です!\n"
+
+#: systemv/lp.c:175
+#, c-format
msgid "%s: Error - expected form after '-f' option!\n"
-msgstr "%s:エラー - ‘-f’オプションの後にフォームが必要です!\n"
+msgstr "%s: エラー - '-f' オプションのあとには用紙名が必要です!\n"
+
+#: systemv/lp.c:404
+#, c-format
msgid "%s: Error - expected hold name after '-H' option!\n"
-msgstr "%s:エラー - ‘-H’オプションの後に保留リストの名前が必要です!\n"
+msgstr "%s: エラー - '-H' オプションのあとにはホールド名が必要です!\n"
+
+#: berkeley/lpr.c:111
+#, c-format
msgid "%s: Error - expected hostname after '-H' option!\n"
-msgstr "%s:エラー - ‘-H’オプションの後にホスト名が必要です!\n"
+msgstr "%s: エラー - '-H' オプションのあとにはホスト名が必要です!\n"
+
+#: berkeley/lpq.c:188 berkeley/lprm.c:130 systemv/cancel.c:130
+#: systemv/cupsaccept.c:131 systemv/lp.c:196 systemv/lpstat.c:298
+#, c-format
msgid "%s: Error - expected hostname after '-h' option!\n"
-msgstr "%s:エラー - ‘-h’オプションの後にホスト名が必要です!\n"
+msgstr "%s: エラー - '-h' オプションのあとにはホスト名が必要です!\n"
+
+#: systemv/lp.c:382
+#, c-format
msgid "%s: Error - expected mode list after '-y' option!\n"
-msgstr "%s:エラー - ‘-y’オプションの後にモードリストが必要です!\n"
+msgstr "%s: エラー - '-y' オプションのあとにはモードリストが必要です!\n"
+
+#: berkeley/lpr.c:275
+#, c-format
msgid "%s: Error - expected name after '-%c' option!\n"
-msgstr "%s:エラー - ‘-%c’オプションの後に名前が必要です!\n"
+msgstr "%s: エラー - '-%c' オプションのあとには名前が必要です!\n"
+
+#: systemv/lp.c:296
+#, c-format
msgid "%s: Error - expected option string after '-o' option!\n"
-msgstr "%s:エラー - ‘-o’オプションの後にオプション文字列が必要です!\n"
+msgstr "%s: エラー - '-o' オプションのあとには文字列が必要です!\n"
+
+#: systemv/lp.c:456
+#, c-format
msgid "%s: Error - expected page list after '-P' option!\n"
-msgstr "%s:エラー - ‘-P’オプションの後にページリストが必要です!\n"
+msgstr "%s: エラー - '-P' オプションのあとにはページリストが必要です!\n"
+
+#: systemv/lp.c:317
+#, c-format
msgid "%s: Error - expected priority after '-%c' option!\n"
-msgstr "%s:エラー - ‘-%c’オプションの後に優先順位が必要です!\n"
+msgstr "%s: エラー - '-%c' オプションのあとには優先度が必要です!\n"
+
+#: systemv/cupsaccept.c:150
+#, c-format
msgid "%s: Error - expected reason text after '-r' option!\n"
-msgstr "%s:エラー - ‘-r’オプションの後に理由テキストが必要です!\n"
+msgstr "%s: エラー - '-r' のあとには理由のテキストが必要です!\n"
+
+#: systemv/lp.c:364
+#, c-format
msgid "%s: Error - expected title after '-t' option!\n"
-msgstr "%s:エラー - ‘-t’オプションの後にタイトルが必要です!\n"
+msgstr "%s: エラー - '-t' オプションのあとにはタイトルが必要です!\n"
+
+#: berkeley/lpq.c:117 berkeley/lpr.c:91 berkeley/lprm.c:110
+#: systemv/cancel.c:99 systemv/cupsaccept.c:108 systemv/lp.c:122
+#: systemv/lpadmin.c:471 systemv/lpstat.c:144
+#, c-format
msgid "%s: Error - expected username after '-U' option!\n"
-msgstr "%s:エラー - ‘-U’オプションの後にユーザ名が必要です!\n"
+msgstr "%s: エラー - '-U' オプションのあとにはユーザ名が必要です!\n"
+
+#: systemv/cancel.c:152
+#, c-format
msgid "%s: Error - expected username after '-u' option!\n"
-msgstr "%s:エラー - ‘-u’オプションの後にユーザ名が必要です!\n"
+msgstr "%s: エラー - '-u' オプションのあとにはユーザ名が必要です!\n"
+
+#: berkeley/lpr.c:134
+#, c-format
msgid "%s: Error - expected value after '-%c' option!\n"
-msgstr "%s:エラー - ‘-%c’オプションの後に値が必要です!\n"
+msgstr "%s: エラー - '-%c' オプションのあとには値が必要です!\n"
+
+#: systemv/lpstat.c:164 systemv/lpstat.c:178
+#, c-format
msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
-msgstr "%s:エラー - ‘-W’オプションの後に“completed”、“not-completed”、または“all”が必要です!\n"
+msgstr "%s: エラー - '-W' オプションのあとには、\"completed\"、\"not-completed\"、\"all\" のいずれかが必要です!\n"
+
+#: berkeley/lpr.c:361 systemv/lp.c:608
+#, c-format
msgid "%s: Error - no default destination available.\n"
-msgstr "%s:エラー - 利用できるデフォルト送信先がありません。\n"
+msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。\n"
+
+#: systemv/lp.c:340
+#, c-format
msgid "%s: Error - priority must be between 1 and 100.\n"
-msgstr "%s:エラー - 優先順位は 1 〜 100 でなければなりません。\n"
+msgstr "%s: エラー - 優先度は 1 から 100 の間である必要があります。\n"
+
+#: berkeley/lpr.c:365 systemv/lp.c:612
+#, c-format
msgid "%s: Error - scheduler not responding!\n"
-msgstr "%s:エラー - スケジューラが応答しません!\n"
+msgstr "%s: エラー - スケジューラが応答していません!\n"
+
+#: berkeley/lpr.c:317 systemv/lp.c:556
+#, c-format
msgid "%s: Error - too many files - \"%s\"\n"
-msgstr "%s:エラー - ファイルが多すぎます - “%s”\n"
+msgstr "%s: エラー - ファイルが多すぎます - \"%s\"\n"
+
+#: berkeley/lpr.c:299 systemv/lp.c:539
+#, c-format
msgid "%s: Error - unable to access \"%s\" - %s\n"
-msgstr "%s:エラー - “%s”にアクセスできません - %s\n"
+msgstr "%s: エラー - \"%s\" にアクセスできません - %s\n"
+
+#: berkeley/lpr.c:410 systemv/lp.c:645
+#, c-format
msgid "%s: Error - unable to queue from stdin - %s\n"
-msgstr "%s:エラー - stdin からキューに入れることはできません - %s\n"
+msgstr "%s: エラー - 標準入力からキューにデータを入力できません! - %s\n"
+
+#: berkeley/lprm.c:93 berkeley/lprm.c:182 systemv/cancel.c:222
+#, c-format
msgid "%s: Error - unknown destination \"%s\"!\n"
-msgstr "%s:エラー - “%s”は不明な送信先です!\n"
+msgstr "%s: エラー - \"%s\" は未知の宛先です!\n"
+
+#: berkeley/lpq.c:157
+#, c-format
msgid "%s: Error - unknown destination \"%s/%s\"!\n"
-msgstr "%s:エラー - “%s/%s”は不明な送信先です!\n"
+msgstr "%s: エラー - \"%s/%s\" は未知の宛先です!\n"
+
+#: berkeley/lpr.c:286 berkeley/lprm.c:148 systemv/cancel.c:164
+#: systemv/cupsaccept.c:174 systemv/lp.c:514 systemv/lpstat.c:459
+#, c-format
msgid "%s: Error - unknown option '%c'!\n"
-msgstr "%s:エラー - ‘-%c’は不明なオプションです!\n"
+msgstr "%s: エラー - '%c' は未知のオプションです!\n"
+
+#: systemv/cupsaccept.c:167
+#, c-format
msgid "%s: Error - unknown option '%s'!\n"
-msgstr "%s:エラー - ‘-%s’は不明なオプションです!\n"
+msgstr "%s: エラー - '%s' は未知のオプションです!\n"
+
+#: systemv/lp.c:216
+#, c-format
msgid "%s: Expected job ID after '-i' option!\n"
-msgstr "%s:‘-i’オプションの後にジョブ ID が必要です!\n"
+msgstr "%s: '-i' オプションのあとにはジョブ ID が必要です!\n"
+
+#: scheduler/cupsfilter.c:540
+#, c-format
msgid "%s: Filter \"%s\" not available: %s\n"
-msgstr "%s: フィルタ“%s”は利用できません:%s\n"
+msgstr "%s: フィルタ \"%s\" は利用できません: %s\n"
+
+#: systemv/lpstat.c:511 systemv/lpstat.c:550
+#, c-format
msgid "%s: Invalid destination name in list \"%s\"!\n"
-msgstr "%s:リスト“%s”に無効な送信先名があります!\n"
+msgstr "%s: リスト \"%s\" に無効な宛先名があります!\n"
+
+#: scheduler/cupsfilter.c:521
+#, c-format
msgid "%s: Invalid filter string \"%s\"\n"
-msgstr "%s:“%s”は無効なフィルタ文字列です\n"
+msgstr "%s: 無効なフィルタ文字列です \"%s\"\n"
+
+#: systemv/lp.c:432
+#, c-format
msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
-msgstr "%s:‘-H restart’の前にジョブ ID(‘-i jobid’)が必要です!\n"
+msgstr "%s: '-H restart' の前にはジョブ ID ('-i ジョブID') が必要です!\n"
+
+#: scheduler/cupsfilter.c:436
+#, c-format
msgid "%s: No filter to convert from %s/%s to %s/%s!\n"
-msgstr "%s:%s/%s から %s/%s に変換するフィルタはありません!\n"
+msgstr "%s: %s/%s から %s/%s に変換するフィルタがありません!\n"
+
+#: systemv/cupsaccept.c:208
+#, c-format
msgid "%s: Operation failed: %s\n"
-msgstr "%s:操作が失敗しました:%s\n"
+msgstr "%s: 操作に失敗しました: %s\n"
+
+#: berkeley/lpq.c:103 berkeley/lpr.c:77 berkeley/lprm.c:72 systemv/cancel.c:85
+#: systemv/cupsaccept.c:94 systemv/cupsaddsmb.c:91 systemv/lp.c:108
+#: systemv/lpadmin.c:277 systemv/lpinfo.c:94 systemv/lpmove.c:79
+#: systemv/lpstat.c:109
+#, c-format
msgid "%s: Sorry, no encryption support compiled in!\n"
-msgstr "%s:暗号化サポートがコンパイルされていません!\n"
+msgstr "%s: すみません、暗号化サポートはコンパイル時に組み込まれていません!\n"
+
+#: berkeley/lpq.c:304 scheduler/cupsfilter.c:1073 systemv/cupsaddsmb.c:149
+#: systemv/cupsaddsmb.c:175
+#, c-format
msgid "%s: Unable to connect to server\n"
-msgstr "%s:サーバに接続できません\n"
+msgstr "%s: サーバーに接続できません\n"
+
+#: systemv/cancel.c:245 systemv/cancel.c:326
+#, c-format
msgid "%s: Unable to contact server!\n"
-msgstr "%s:サーバに接続できません!\n"
+msgstr "%s: サーバーに連絡できません!\n"
+
+#: scheduler/cupsfilter.c:404
+#, c-format
msgid "%s: Unable to determine MIME type of \"%s\"!\n"
-msgstr "%s:“%s”の MIME タイプを判断できません!\n"
+msgstr "%s: \"%s\" の MIME タイプを判別できません!\n"
+
+#: ppdc/ppdmerge.cxx:99
+#, c-format
msgid "%s: Unable to open %s - %s\n"
-msgstr "%s:%s を開けません - %s\n"
+msgstr "%s: %s を開けません - %s\n"
+
+#: ppdc/ppdmerge.cxx:113
+#, c-format
msgid "%s: Unable to open %s - %s on line %d.\n"
-msgstr "%s:%s を開けません - %s、行 %d\n"
+msgstr "%s: %s を開けません。- %s の %d 行目。\n"
+
+#: ppdc/ppdc-file.cxx:50
+#, c-format
msgid "%s: Unable to open %s: %s\n"
-msgstr "%s:%s を開けません:%s\n"
+msgstr "%s: %sを開けません: %s\n"
+
+#: scheduler/cupsfilter.c:583
+#, c-format
msgid "%s: Unable to open PPD file: %s on line %d\n"
-msgstr "%s:PPD ファイルを開けません:%s、行 %d\n"
+msgstr "%s: PPD ファイルを開けません: %s の %d 行目\n"
+
+#: scheduler/cupsfilter.c:377
+#, c-format
msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n"
-msgstr "%s:“%s”または“%s”から MIME データベースを読み取れません!\n"
+msgstr "%s: \"%s\" または \"%s\" から MIME データベースを読み取ることができません!\n"
+
+#: berkeley/lpq.c:161 systemv/lpstat.c:565
+#, c-format
msgid "%s: Unknown destination \"%s\"!\n"
-msgstr "%s:“%s”は不明な送信先です!\n"
+msgstr "%s: \"%s\" は未知の宛先です!\n"
+
+#: scheduler/cupsfilter.c:415
+#, c-format
msgid "%s: Unknown destination MIME type %s/%s!\n"
-msgstr "%s:%s/%s は不明な送信先 MIME タイプです!\n"
+msgstr "%s: %s/%s は未知の宛先 MIME タイプです!\n"
+
+#: scheduler/cupsfilter.c:1281
+#, c-format
msgid "%s: Unknown option '%c'!\n"
-msgstr "%s:‘-%c’は不明なオプションです!\n"
+msgstr "%s: '%c' は未知のオプションです!\n"
+
+#: scheduler/cupsfilter.c:396
+#, c-format
msgid "%s: Unknown source MIME type %s/%s!\n"
-msgstr "%s:%s/%s は不明な送信元 MIME タイプです!\n"
+msgstr "%s: %s/%s は未知のソース MIME タイプです!\n"
+
+#: berkeley/lpr.c:148
+#, c-format
msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
-msgstr "%s:警告 - '%c' フォーマット修飾子には対応していません - 出力が正しくない可能性があります!\n"
+msgstr "%s: 警告 - '%c' 形式修飾子はサポートされていません - 出力は正しくないものになるかもしれません!\n"
+
+#: systemv/lp.c:485
+#, c-format
msgid "%s: Warning - character set option ignored!\n"
-msgstr "%s:警告 - 文字セットオプションは無視されました!\n"
+msgstr "%s: 警告 - 文字セットオプションは無視されます!\n"
+
+#: systemv/lp.c:505
+#, c-format
msgid "%s: Warning - content type option ignored!\n"
-msgstr "%s:警告 - コンテンツ・タイプ・オプションは無視されました!\n"
+msgstr "%s: 警告 - コンテンツタイプオプションは無視されます!\n"
+
+#: systemv/lp.c:182
+#, c-format
msgid "%s: Warning - form option ignored!\n"
-msgstr "%s:警告 - フォームオプションは無視されました!\n"
+msgstr "%s: 警告 - 用紙オプションは無視されます!\n"
+
+#: systemv/lp.c:390
+#, c-format
msgid "%s: Warning - mode option ignored!\n"
-msgstr "%s:警告 - モードオプションは無視されました!\n"
+msgstr "%s: 警告 - モードオプションは無視されます!\n"
+
+#: berkeley/lpq.c:245
+#, c-format
msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr "%s:エラー - %s 環境変数名に存在しない送信先“%s”が指定されています!\n"
+msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています!\n"
+
+#: berkeley/lpr.c:162
+#, c-format
msgid "%s: error - expected option=value after '-o' option!\n"
-msgstr "%s:エラー - ‘-o’オプションの後に option=value が必要です!\n"
+msgstr "%s: エラー - '-o' オプションのあとには オプション=値 が必要です!\n"
+
+#: berkeley/lpq.c:250
+#, c-format
msgid "%s: error - no default destination available.\n"
-msgstr "%s:エラー - 利用できるデフォルト送信先がありません。\n"
+msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。\n"
+
+#: ppdc/sample.c:282
msgid "-1"
msgstr "-1"
+
+#: ppdc/sample.c:273
msgid "-10"
msgstr "-10"
+
+#: ppdc/sample.c:365
msgid "-100"
msgstr "-100"
+
+#: ppdc/sample.c:364
msgid "-105"
msgstr "-105"
+
+#: ppdc/sample.c:272
msgid "-11"
msgstr "-11"
+
+#: ppdc/sample.c:363
msgid "-110"
msgstr "-110"
+
+#: ppdc/sample.c:362
msgid "-115"
msgstr "-115"
+
+#: ppdc/sample.c:271
msgid "-12"
msgstr "-12"
+
+#: ppdc/sample.c:361
msgid "-120"
msgstr "-120"
+
+#: ppdc/sample.c:270
msgid "-13"
msgstr "-13"
+
+#: ppdc/sample.c:269
msgid "-14"
msgstr "-14"
+
+#: ppdc/sample.c:268
msgid "-15"
msgstr "-15"
+
+#: ppdc/sample.c:281
msgid "-2"
msgstr "-2"
+
+#: ppdc/sample.c:381
msgid "-20"
msgstr "-20"
+
+#: ppdc/sample.c:380
msgid "-25"
msgstr "-25"
+
+#: ppdc/sample.c:280
msgid "-3"
msgstr "-3"
+
+#: ppdc/sample.c:379
msgid "-30"
msgstr "-30"
+
+#: ppdc/sample.c:378
msgid "-35"
msgstr "-35"
+
+#: ppdc/sample.c:279
msgid "-4"
msgstr "-4"
+
+#: ppdc/sample.c:377
msgid "-40"
msgstr "-40"
+
+#: ppdc/sample.c:376
msgid "-45"
msgstr "-45"
+
+#: ppdc/sample.c:278
msgid "-5"
msgstr "-5"
+
+#: ppdc/sample.c:375
msgid "-50"
msgstr "-50"
+
+#: ppdc/sample.c:374
msgid "-55"
msgstr "-55"
+
+#: ppdc/sample.c:277
msgid "-6"
msgstr "-6"
+
+#: ppdc/sample.c:373
msgid "-60"
msgstr "-60"
+
+#: ppdc/sample.c:372
msgid "-65"
msgstr "-65"
+
+#: ppdc/sample.c:276
msgid "-7"
msgstr "-7"
+
+#: ppdc/sample.c:371
msgid "-70"
msgstr "-70"
+
+#: ppdc/sample.c:370
msgid "-75"
msgstr "-75"
+
+#: ppdc/sample.c:275
msgid "-8"
msgstr "-8"
+
+#: ppdc/sample.c:369
msgid "-80"
msgstr "-80"
+
+#: ppdc/sample.c:368
msgid "-85"
msgstr "-85"
+
+#: ppdc/sample.c:274
msgid "-9"
msgstr "-9"
+
+#: ppdc/sample.c:367
msgid "-90"
msgstr "-90"
+
+#: ppdc/sample.c:366
msgid "-95"
msgstr "-95"
+
+#: ppdc/sample.c:283
msgid "0"
msgstr "0"
+
+#: ppdc/sample.c:284
msgid "1"
msgstr "1"
+
+#: ppdc/sample.c:356
msgid "1 inch/sec."
-msgstr "1 インチ/秒"
+msgstr "1 インチ/秒"
+
+#: ppdc/sample.c:144
msgid "1.25x0.25\""
-msgstr "1.25 x 0.25\""
+msgstr "1.25x0.25インチ"
+
+#: ppdc/sample.c:145
msgid "1.25x2.25\""
-msgstr "1.25 x 2.25\""
+msgstr "1.25x2.25インチ"
+
+#: ppdc/sample.c:404
msgid "1.5 inch/sec."
-msgstr "1.5 インチ/秒"
+msgstr "1.5 インチ/秒"
+
+#: ppdc/sample.c:146
msgid "1.50x0.25\""
-msgstr "1.50 x 0.25\""
+msgstr "1.50x0.25インチ"
+
+#: ppdc/sample.c:147
msgid "1.50x0.50\""
-msgstr "1.50 x 0.50\""
+msgstr "1.50x0.50インチ"
+
+#: ppdc/sample.c:148
msgid "1.50x1.00\""
-msgstr "1.50 x 1.00\""
+msgstr "1.50x1.00インチ"
+
+#: ppdc/sample.c:149
msgid "1.50x2.00\""
-msgstr "1.50 x 2.00\""
+msgstr "1.50x2.00インチ"
+
+#: ppdc/sample.c:293
msgid "10"
msgstr "10"
+
+#: ppdc/sample.c:415
msgid "10 inches/sec."
-msgstr "10 インチ/秒"
+msgstr "10 インチ/秒"
+
+#: ppdc/sample.c:1
msgid "10 x 11\""
-msgstr "10 x 11\""
+msgstr "10 x 11インチ"
+
+#: ppdc/sample.c:2
msgid "10 x 13\""
-msgstr "10 x 13\""
+msgstr "10 x 13インチ"
+
+#: ppdc/sample.c:3
msgid "10 x 14\""
-msgstr "10 x 14\""
+msgstr "10 x 14インチ"
+
+#: ppdc/sample.c:395
msgid "100"
msgstr "100"
+
+#: ppdc/sample.c:306
msgid "100 mm/sec."
-msgstr "100 mm/秒"
+msgstr "100 ミリメートル/秒"
+
+#: ppdc/sample.c:396
msgid "105"
msgstr "105"
+
+#: ppdc/sample.c:294
msgid "11"
msgstr "11"
+
+#: ppdc/sample.c:416
msgid "11 inches/sec."
-msgstr "11 インチ/秒"
+msgstr "11 インチ/秒"
+
+#: ppdc/sample.c:397
msgid "110"
msgstr "110"
+
+#: ppdc/sample.c:398
msgid "115"
msgstr "115"
+
+#: ppdc/sample.c:295
msgid "12"
msgstr "12"
+
+#: ppdc/sample.c:417
msgid "12 inches/sec."
-msgstr "12 インチ/秒"
+msgstr "12 インチ/秒"
+
+#: ppdc/sample.c:4
msgid "12 x 11\""
-msgstr "12 x 11\""
+msgstr "12 x 11インチ"
+
+#: ppdc/sample.c:399
msgid "120"
msgstr "120"
+
+#: ppdc/sample.c:307
msgid "120 mm/sec."
-msgstr "120 mm/秒"
+msgstr "120 ミリメートル/秒"
+
+#: ppdc/sample.c:215
msgid "120x60dpi"
-msgstr "120 x 60 dpi"
+msgstr "120x60dpi"
+
+#: ppdc/sample.c:221
msgid "120x72dpi"
-msgstr "120 x 72 dpi"
+msgstr "120x72dpi"
+
+#: ppdc/sample.c:296
msgid "13"
msgstr "13"
+
+#: ppdc/sample.c:204
msgid "136dpi"
-msgstr "136 dpi"
+msgstr "136dpi"
+
+#: ppdc/sample.c:297
msgid "14"
msgstr "14"
+
+#: ppdc/sample.c:298
msgid "15"
msgstr "15"
+
+#: ppdc/sample.c:300
msgid "15 mm/sec."
-msgstr "15 mm/秒"
+msgstr "15 ミリメートル/秒"
+
+#: ppdc/sample.c:5
msgid "15 x 11\""
-msgstr "15 x 11\""
+msgstr "15 x 11インチ"
+
+#: ppdc/sample.c:308
msgid "150 mm/sec."
-msgstr "150 mm/秒"
+msgstr "150 ミリメートル/秒"
+
+#: ppdc/sample.c:254
msgid "150dpi"
-msgstr "150 dpi"
+msgstr "150dpi"
+
+#: ppdc/sample.c:340
msgid "16"
msgstr "16"
+
+#: ppdc/sample.c:341
msgid "17"
msgstr "17"
+
+#: ppdc/sample.c:342
msgid "18"
msgstr "18"
+
+#: ppdc/sample.c:216
msgid "180dpi"
-msgstr "180 dpi"
+msgstr "180dpi"
+
+#: ppdc/sample.c:343
msgid "19"
msgstr "19"
+
+#: ppdc/sample.c:285
msgid "2"
msgstr "2"
+
+#: ppdc/sample.c:357
msgid "2 inches/sec."
-msgstr "2 インチ/秒"
+msgstr "2 インチ/秒"
+
+#: ppdc/sample.c:242
msgid "2-Sided Printing"
msgstr "両面印刷"
+
+#: ppdc/sample.c:150
msgid "2.00x0.37\""
-msgstr "2.00 x 0.37\""
+msgstr "2.00x0.37インチ"
+
+#: ppdc/sample.c:151
msgid "2.00x0.50\""
-msgstr "2.00 x 0.50\""
+msgstr "2.00x0.50インチ"
+
+#: ppdc/sample.c:152
msgid "2.00x1.00\""
-msgstr "2.00 x 1.00\""
+msgstr "2.00x1.00インチ"
+
+#: ppdc/sample.c:153
msgid "2.00x1.25\""
-msgstr "2.00 x 1.25\""
+msgstr "2.00x1.25インチ"
+
+#: ppdc/sample.c:154
msgid "2.00x2.00\""
-msgstr "2.00 x 2.00\""
+msgstr "2.00x2.00インチ"
+
+#: ppdc/sample.c:155
msgid "2.00x3.00\""
-msgstr "2.00 x 3.00\""
+msgstr "2.00x3.00インチ"
+
+#: ppdc/sample.c:156
msgid "2.00x4.00\""
-msgstr "2.00 x 4.00\""
+msgstr "2.00x4.00インチ"
+
+#: ppdc/sample.c:157
msgid "2.00x5.50\""
-msgstr "2.00 x 5.50\""
+msgstr "2.00x5.50インチ"
+
+#: ppdc/sample.c:158
msgid "2.25x0.50\""
-msgstr "2.25 x 0.50\""
+msgstr "2.25x0.50インチ"
+
+#: ppdc/sample.c:159
msgid "2.25x1.25\""
-msgstr "2.25 x 1.50\""
+msgstr "2.25x1.25インチ"
+
+#: ppdc/sample.c:160
msgid "2.25x4.00\""
-msgstr "2.25 x 4.00\""
+msgstr "2.25x4.00インチ"
+
+#: ppdc/sample.c:161
msgid "2.25x5.50\""
-msgstr "2.25 x 5.50\""
+msgstr "2.25x5.50インチ"
+
+#: ppdc/sample.c:162
msgid "2.38x5.50\""
-msgstr "2.38 x 5.50\""
+msgstr "2.38x5.50インチ"
+
+#: ppdc/sample.c:405
msgid "2.5 inches/sec."
-msgstr "2.5 インチ/秒"
+msgstr "2.5 インチ/秒"
+
+#: ppdc/sample.c:163
msgid "2.50x1.00\""
-msgstr "2.50 x 1.00\""
+msgstr "2.50x1.00インチ"
+
+#: ppdc/sample.c:164
msgid "2.50x2.00\""
-msgstr "2.50 x 2.00\""
+msgstr "2.50x2.00インチ"
+
+#: ppdc/sample.c:165
msgid "2.75x1.25\""
-msgstr "2.75 x 1.25\""
+msgstr "2.75x1.25インチ"
+
+#: ppdc/sample.c:166
msgid "2.9 x 1\""
-msgstr "2.9 x 1\""
+msgstr "2.9 x 1インチ"
+
+#: ppdc/sample.c:344
msgid "20"
msgstr "20"
+
+#: ppdc/sample.c:301
msgid "20 mm/sec."
-msgstr "20 mm/秒"
+msgstr "20 ミリメートル/秒"
+
+#: ppdc/sample.c:309
msgid "200 mm/sec."
-msgstr "200 mm/秒"
+msgstr "200 ミリメートル/秒"
+
+#: ppdc/sample.c:205
msgid "203dpi"
-msgstr "203 dpi"
+msgstr "203dpi"
+
+#: ppdc/sample.c:345
msgid "21"
msgstr "21"
+
+#: ppdc/sample.c:346
msgid "22"
msgstr "22"
+
+#: ppdc/sample.c:347
msgid "23"
msgstr "23"
+
+#: ppdc/sample.c:348
msgid "24"
msgstr "24"
+
+#: ppdc/sample.c:213
msgid "24-Pin Series"
-msgstr "24 ピンシリーズ"
+msgstr "24ピンシリーズ"
+
+#: ppdc/sample.c:222
msgid "240x72dpi"
-msgstr "240 x 72 dpi"
+msgstr "240x72dpi"
+
+#: ppdc/sample.c:349
msgid "25"
msgstr "25"
+
+#: ppdc/sample.c:310
msgid "250 mm/sec."
-msgstr "250 mm/秒"
+msgstr "250 ミリメートル/秒"
+
+#: ppdc/sample.c:350
msgid "26"
msgstr "26"
+
+#: ppdc/sample.c:351
msgid "27"
msgstr "27"
+
+#: ppdc/sample.c:352
msgid "28"
msgstr "28"
+
+#: ppdc/sample.c:353
msgid "29"
msgstr "29"
+
+#: ppdc/sample.c:286
msgid "3"
msgstr "3"
+
+#: ppdc/sample.c:358
msgid "3 inches/sec."
-msgstr "3 インチ/秒"
+msgstr "3 インチ/秒"
+
+#: ppdc/sample.c:167
msgid "3.00x1.00\""
-msgstr "3.00 x 1.00\""
+msgstr "3.00x1.00インチ"
+
+#: ppdc/sample.c:168
msgid "3.00x1.25\""
-msgstr "3.00 x 1.25\""
+msgstr "3.00x1.25インチ"
+
+#: ppdc/sample.c:169
msgid "3.00x2.00\""
-msgstr "3.00 x 2.00\""
+msgstr "3.00x2.00インチ"
+
+#: ppdc/sample.c:170
msgid "3.00x3.00\""
-msgstr "3.00 x 3.00\""
+msgstr "3.00x3.00インチ"
+
+#: ppdc/sample.c:171
msgid "3.00x5.00\""
-msgstr "3.00 x 5.00\""
+msgstr "3.00x5.00インチ"
+
+#: ppdc/sample.c:172
msgid "3.25x2.00\""
-msgstr "3.25 x 2.00\""
+msgstr "3.25x2.00インチ"
+
+#: ppdc/sample.c:173
msgid "3.25x5.00\""
-msgstr "3.25 x 5.00\""
+msgstr "3.25x5.00インチ"
+
+#: ppdc/sample.c:174
msgid "3.25x5.50\""
-msgstr "3.25 x 5.50\""
+msgstr "3.25x5.50インチ"
+
+#: ppdc/sample.c:175
msgid "3.25x5.83\""
-msgstr "3.25 x 5.83\""
+msgstr "3.25x5.83インチ"
+
+#: ppdc/sample.c:176
msgid "3.25x7.83\""
-msgstr "3.25 x 7.83\""
+msgstr "3.25x7.83インチ"
+
+#: ppdc/sample.c:134
msgid "3.5\" Disk"
-msgstr "3.5\" ディスク"
+msgstr "3.5 インチDisk"
+
+#: ppdc/sample.c:143
msgid "3.5\" Disk - 2 1/8 x 2 3/4\""
-msgstr "3.5\" ディスク - 2 1/8 x 2 3/4\""
+msgstr "3.5インチ Disk - 2 1/8 x 2 3/4インチ"
+
+#: ppdc/sample.c:177
msgid "3.50x1.00\""
-msgstr "3.50 x 1.00\""
+msgstr "3.50x1.00インチ"
+
+#: ppdc/sample.c:354
msgid "30"
msgstr "30"
+
+#: ppdc/sample.c:302
msgid "30 mm/sec."
-msgstr "30 mm/秒"
+msgstr "30 ミリメートル/秒"
+
+#: ppdc/sample.c:311
msgid "300 mm/sec."
-msgstr "300 mm/秒"
+msgstr "300 ミリメートル/秒"
+
+#: ppdc/sample.c:206
msgid "300dpi"
-msgstr "300 dpi"
+msgstr "300dpi"
+
+#: ppdc/sample.c:382
msgid "35"
msgstr "35"
+
+#: ppdc/sample.c:218
msgid "360dpi"
-msgstr "360 dpi"
+msgstr "360dpi"
+
+#: ppdc/sample.c:217
msgid "360x180dpi"
-msgstr "360 x 180 dpi"
+msgstr "360x180dpi"
+
+#: ppdc/sample.c:287
msgid "4"
msgstr "4"
+
+#: ppdc/sample.c:359
msgid "4 inches/sec."
-msgstr "4 インチ/秒"
+msgstr "4 インチ/秒"
+
+#: ppdc/sample.c:178
msgid "4.00x1.00\""
-msgstr "4.00 x 1.00\""
+msgstr "4.00x1.00インチ"
+
+#: ppdc/sample.c:186
msgid "4.00x13.00\""
-msgstr "4.00 x 13.00\""
+msgstr "4.00x13.00インチ"
+
+#: ppdc/sample.c:179
msgid "4.00x2.00\""
-msgstr "4.00 x 2.00\""
+msgstr "4.00x2.00インチ"
+
+#: ppdc/sample.c:180
msgid "4.00x2.50\""
-msgstr "4.00 x 2.50\""
+msgstr "4.00x2.50インチ"
+
+#: ppdc/sample.c:181
msgid "4.00x3.00\""
-msgstr "4.00 x 3.00\""
+msgstr "4.00x3.00インチ"
+
+#: ppdc/sample.c:182
msgid "4.00x4.00\""
-msgstr "4.00 x 4.00\""
+msgstr "4.00x4.00インチ"
+
+#: ppdc/sample.c:183
msgid "4.00x5.00\""
-msgstr "4.00 x 5.00\""
+msgstr "4.00x5.00インチ"
+
+#: ppdc/sample.c:184
msgid "4.00x6.00\""
-msgstr "4.00 x 6.00\""
+msgstr "4.00x6.00インチ"
+
+#: ppdc/sample.c:185
msgid "4.00x6.50\""
-msgstr "4.00 x 6.50\""
+msgstr "4.00x6.50インチ"
+
+#: ppdc/sample.c:383
msgid "40"
msgstr "40"
+
+#: ppdc/sample.c:303
msgid "40 mm/sec."
-msgstr "40 mm/秒"
+msgstr "40 ミリメートル/秒"
+
+#: ppdc/sample.c:384
msgid "45"
msgstr "45"
+
+#: ppdc/sample.c:288
msgid "5"
msgstr "5"
+
+#: ppdc/sample.c:409
msgid "5 inches/sec."
-msgstr "5 インチ/秒"
+msgstr "5 インチ/秒"
+
+#: ppdc/sample.c:385
msgid "50"
msgstr "50"
+
+#: ppdc/sample.c:386
msgid "55"
msgstr "55"
+
+#: ppdc/sample.c:289
msgid "6"
msgstr "6"
+
+#: ppdc/sample.c:410
msgid "6 inches/sec."
-msgstr "6 インチ/秒"
+msgstr "6 インチ/秒"
+
+#: ppdc/sample.c:187
msgid "6.00x1.00\""
-msgstr "6.00 x 1.00\""
+msgstr "6.00x1.00\""
+
+#: ppdc/sample.c:188
msgid "6.00x2.00\""
-msgstr "6.00 x 2.00\""
+msgstr "6.00x2.00\""
+
+#: ppdc/sample.c:189
msgid "6.00x3.00\""
-msgstr "6.00 x 3.00\""
+msgstr "6.00x3.00\""
+
+#: ppdc/sample.c:190
msgid "6.00x4.00\""
-msgstr "6.00 x 4.00\""
+msgstr "6.00x4.00\""
+
+#: ppdc/sample.c:191
msgid "6.00x5.00\""
-msgstr "6.00 x 5.00\""
+msgstr "6.00x5.00\""
+
+#: ppdc/sample.c:192
msgid "6.00x6.00\""
-msgstr "6.00 x 6.00\""
+msgstr "6.00x6.00\""
+
+#: ppdc/sample.c:193
msgid "6.00x6.50\""
-msgstr "6.00 x 6.50\""
+msgstr "6.00x6.50\""
+
+#: ppdc/sample.c:387
msgid "60"
msgstr "60"
+
+#: ppdc/sample.c:304
msgid "60 mm/sec."
-msgstr "60 mm/秒"
+msgstr "60 mm/秒"
+
+#: ppdc/sample.c:255
msgid "600 DPI Grayscale"
-msgstr "600 DPI グレイスケール"
+msgstr "600 DPI グレースケール"
+
+#: ppdc/sample.c:233
msgid "600dpi"
-msgstr "600 dpi"
+msgstr "600dpi"
+
+#: ppdc/sample.c:214
msgid "60dpi"
-msgstr "60 dpi"
+msgstr "60dpi"
+
+#: ppdc/sample.c:220
msgid "60x720dpi"
-msgstr "60 x 720 dpi"
+msgstr "60x720dpi"
+
+#: ppdc/sample.c:388
msgid "65"
msgstr "65"
+
+#: ppdc/sample.c:290
msgid "7"
msgstr "7"
+
+#: ppdc/sample.c:412
msgid "7 inches/sec."
-msgstr "7 インチ/秒"
+msgstr "7 インチ/秒"
+
+#: ppdc/sample.c:6
msgid "7 x 9\""
msgstr "7 x 9\""
+
+#: ppdc/sample.c:389
msgid "70"
msgstr "70"
+
+#: ppdc/sample.c:224
msgid "720dpi"
-msgstr "720 dpi"
+msgstr "720dpi"
+
+#: ppdc/sample.c:390
msgid "75"
msgstr "75"
+
+#: ppdc/sample.c:291
msgid "8"
msgstr "8"
+
+#: ppdc/sample.c:413
msgid "8 inches/sec."
-msgstr "8 インチ/秒"
+msgstr "8 インチ/秒"
+
+#: ppdc/sample.c:7
msgid "8 x 10\""
msgstr "8 x 10\""
+
+#: ppdc/sample.c:194
msgid "8.00x1.00\""
-msgstr "8.00 x 1.00\""
+msgstr "8.00x1.00\""
+
+#: ppdc/sample.c:195
msgid "8.00x2.00\""
-msgstr "8.00 x 2.00\""
+msgstr "8.00x2.00\""
+
+#: ppdc/sample.c:196
msgid "8.00x3.00\""
-msgstr "8.00 x 3.00\""
+msgstr "8.00x3.00\""
+
+#: ppdc/sample.c:197
msgid "8.00x4.00\""
-msgstr "8.00 x 4.00\""
+msgstr "8.00x4.00\""
+
+#: ppdc/sample.c:198
msgid "8.00x5.00\""
-msgstr "8.00 x 5.00\""
+msgstr "8.00x5.00\""
+
+#: ppdc/sample.c:199
msgid "8.00x6.00\""
-msgstr "8.00 x 6.00\""
+msgstr "8.00x6.00\""
+
+#: ppdc/sample.c:200
msgid "8.00x6.50\""
-msgstr "8.00 x 6.50\""
+msgstr "8.00x6.50\""
+
+#: ppdc/sample.c:391
msgid "80"
msgstr "80"
+
+#: ppdc/sample.c:305
msgid "80 mm/sec."
-msgstr "80 mm/秒"
+msgstr "80 mm/秒"
+
+#: ppdc/sample.c:392
msgid "85"
msgstr "85"
+
+#: ppdc/sample.c:292
msgid "9"
msgstr "9"
+
+#: ppdc/sample.c:414
msgid "9 inches/sec."
-msgstr "9 インチ/秒"
+msgstr "9 インチ/秒"
+
+#: ppdc/sample.c:8
msgid "9 x 11\""
msgstr "9 x 11\""
+
+#: ppdc/sample.c:9
msgid "9 x 12\""
msgstr "9 x 12\""
+
+#: ppdc/sample.c:219
msgid "9-Pin Series"
-msgstr "9 ピンシリーズ"
+msgstr "9-Pin Series"
+
+#: ppdc/sample.c:393
msgid "90"
msgstr "90"
+
+#: ppdc/sample.c:394
msgid "95"
msgstr "95"
+
+#: berkeley/lpc.c:218
msgid "?Invalid help command unknown\n"
-msgstr "?無効なヘルプコマンド 不明\n"
+msgstr "?無効なヘルプコマンドです\n"
+
+#: cgi-bin/admin.c:2331
msgid "A Samba password is required to export printer drivers!"
-msgstr "プリンタドライバを書き出すには Samba パスワードが必要です!"
+msgstr "プリンタードライバーをエクスポートするには Samba のパスワードが必要です!"
+
+#: cgi-bin/admin.c:2327
msgid "A Samba username is required to export printer drivers!"
-msgstr "プリンタドライバを書き出すには Samba ユーザ名が必要です!"
+msgstr "プリンタードライバーをエクスポートするには、Samba のユーザー名が必要です!"
+
+#: scheduler/ipp.c:2378
+#, c-format
msgid "A class named \"%s\" already exists!"
-msgstr "“%s”という名前のクラスはすでに存在します!"
+msgstr "\"%s\" という名前のクラスはすでに存在します!"
+
+#: scheduler/ipp.c:1001
+#, c-format
msgid "A printer named \"%s\" already exists!"
-msgstr "“%s”という名前のプリンタはすでに存在します!"
+msgstr "\"%s\" という名前のプリンターはすでに存在します!"
+
+#: ppdc/sample.c:10
msgid "A0"
msgstr "A0"
+
+#: ppdc/sample.c:11
msgid "A1"
msgstr "A1"
+
+#: ppdc/sample.c:24
msgid "A10"
msgstr "A10"
+
+#: ppdc/sample.c:12
msgid "A2"
msgstr "A2"
+
+#: ppdc/sample.c:13
msgid "A3"
msgstr "A3"
+
+#: ppdc/sample.c:14
msgid "A3 (Oversize)"
-msgstr "A3(特大)"
+msgstr "A3 (特大)"
+
+#: ppdc/sample.c:15
msgid "A4"
msgstr "A4"
+
+#: ppdc/sample.c:16
msgid "A4 (Oversize)"
-msgstr "A4(特大)"
+msgstr "A4 (特大)"
+
+#: ppdc/sample.c:17
msgid "A4 (Small)"
-msgstr "A4(小)"
+msgstr "A4 (小)"
+
+#: ppdc/sample.c:18
msgid "A5"
msgstr "A5"
+
+#: ppdc/sample.c:19
msgid "A5 (Oversize)"
-msgstr "A5(特大)"
+msgstr "A5 (特大)"
+
+#: ppdc/sample.c:20
msgid "A6"
msgstr "A6"
+
+#: ppdc/sample.c:21
msgid "A7"
msgstr "A7"
+
+#: ppdc/sample.c:22
msgid "A8"
msgstr "A8"
+
+#: ppdc/sample.c:23
msgid "A9"
msgstr "A9"
+
+#: ppdc/sample.c:25
msgid "ANSI A"
msgstr "ANSI A"
+
+#: ppdc/sample.c:26
msgid "ANSI B"
msgstr "ANSI B"
+
+#: ppdc/sample.c:27
msgid "ANSI C"
msgstr "ANSI C"
+
+#: ppdc/sample.c:28
msgid "ANSI D"
msgstr "ANSI D"
+
+#: ppdc/sample.c:29
msgid "ANSI E"
msgstr "ANSI E"
+
+#: ppdc/sample.c:30
msgid "ARCH A"
msgstr "ARCH A"
+
+#: ppdc/sample.c:31
msgid "ARCH B"
msgstr "ARCH B"
+
+#: ppdc/sample.c:32
msgid "ARCH C"
msgstr "ARCH C"
+
+#: ppdc/sample.c:33
msgid "ARCH D"
msgstr "ARCH D"
+
+#: ppdc/sample.c:34
msgid "ARCH E"
msgstr "ARCH E"
+
+#: cgi-bin/classes.c:154 cgi-bin/printers.c:157
msgid "Accept Jobs"
-msgstr "ジョブを受け入れる"
+msgstr "ジョブの受け付け"
+
+#: cups/http-support.c:1194
msgid "Accepted"
-msgstr "受け入れ済み"
+msgstr "受け付けました"
+
+#: cgi-bin/admin.c:480
msgid "Add Class"
-msgstr "クラスを追加"
+msgstr "クラスの追加"
+
+#: cgi-bin/admin.c:772
msgid "Add Printer"
-msgstr "プリンタを追加"
+msgstr "プリンターの追加"
+
+#: cgi-bin/admin.c:355 cgi-bin/admin.c:388 cgi-bin/admin.c:436
+#: cgi-bin/admin.c:446
msgid "Add RSS Subscription"
-msgstr "RSS 照会先を追加"
+msgstr "RSS 購読を追加"
+
+#: ppdc/sample.c:126
msgid "Address"
-msgstr "住所"
+msgstr "アドレス"
+
+#: ppdc/sample.c:135
msgid "Address - 1 1/8 x 3 1/2\""
-msgstr "住所 - 1 1/8 x 3 1/2\""
+msgstr "アドレス - 1 1/8 x 3 1/2\""
+
+#: cgi-bin/admin.c:187 cgi-bin/admin.c:218 cgi-bin/admin.c:2749
msgid "Administration"
msgstr "管理"
+
+#: ppdc/sample.c:401
msgid "Always"
-msgstr "常に"
+msgstr "常に有効"
+
+#: backend/socket.c:126
msgid "AppSocket/HP JetDirect"
-msgstr "AppSocket/HP JetDirect"
+msgstr "AppSocket/HP JetDirect"
+
+#: ppdc/sample.c:422
msgid "Applicator"
-msgstr "アプリケータ"
+msgstr "アプリケーター"
+
+#: scheduler/ipp.c:1123
+#, c-format
msgid "Attempt to set %s printer-state to bad value %d!"
-msgstr "%s printer-state に不正な値 %d を設定しようとしています!"
+msgstr "%s printer-state に 不正な値 %d を設定しようとしています!"
+
+#: scheduler/ipp.c:331
+#, c-format
msgid "Attribute groups are out of order (%x < %x)!"
-msgstr "属性グループの順序が正しくありません(%x < %x)!"
+msgstr "属性グループは範囲外です (%x < %x)!"
+
+#: ppdc/sample.c:35
msgid "B0"
msgstr "B0"
+
+#: ppdc/sample.c:37
msgid "B1"
msgstr "B1"
+
+#: ppdc/sample.c:36
msgid "B10"
msgstr "B10"
+
+#: ppdc/sample.c:38
msgid "B2"
msgstr "B2"
+
+#: ppdc/sample.c:39
msgid "B3"
msgstr "B3"
+
+#: ppdc/sample.c:40
msgid "B4"
msgstr "B4"
+
+#: ppdc/sample.c:41
msgid "B5"
msgstr "B5"
+
+#: ppdc/sample.c:42
msgid "B6"
msgstr "B6"
+
+#: ppdc/sample.c:43
msgid "B7"
msgstr "B7"
+
+#: ppdc/sample.c:44
msgid "B8"
msgstr "B8"
+
+#: ppdc/sample.c:45
msgid "B9"
msgstr "B9"
+
+#: cups/dest.c:317
msgid "Bad NULL dests pointer"
-msgstr "NULL 送信先サーバポインタは正しくありません"
+msgstr "不正な NULL 送信先ポインター"
+
+#: cups/ppd.c:341
msgid "Bad OpenGroup"
-msgstr "OpenGroup が正しくありません"
+msgstr "不正な OpenGroup"
+
+#: cups/ppd.c:343
msgid "Bad OpenUI/JCLOpenUI"
-msgstr "OpenUI/JCLOpenUI が正しくありません"
+msgstr "不正な OpenUI/JCLOpenUI"
+
+#: cups/ppd.c:345
msgid "Bad OrderDependency"
-msgstr "OrderDependency が正しくありません"
+msgstr "不正な OrderDependency"
+
+#: cups/http-support.c:1209
msgid "Bad Request"
-msgstr "Request が正しくありません"
+msgstr "不正なリクエスト"
+
+#: cups/snmp.c:1001
msgid "Bad SNMP version number"
-msgstr "SNMP バージョン番号が正しくありません"
+msgstr "不正な SNMP バージョン番号"
+
+#: cups/ppd.c:346
msgid "Bad UIConstraints"
-msgstr "UIConstraints が正しくありません"
+msgstr "不正な UIConstraints"
+
+#: scheduler/ipp.c:1423
+#, c-format
msgid "Bad copies value %d."
-msgstr "部数値 %d が正しくありません。"
+msgstr "%d は不正なコピー値です。"
+
+#: cups/ppd.c:354
msgid "Bad custom parameter"
-msgstr "カスタムパラメータが正しくありません"
+msgstr "不正なカスタムパラメーター"
+
+#: cups/http-support.c:1333
+#, c-format
msgid "Bad device URI \"%s\"!\n"
-msgstr "デバイス URI “%s”が正しくありません!\n"
+msgstr "\"%s\" は無効なデバイス URI です!\n"
+
+#: scheduler/ipp.c:2496
+#, c-format
msgid "Bad device-uri \"%s\"!"
-msgstr "device-uri “%s”が正しくありません!"
+msgstr "\"%s\" は無効な device-uri です!"
+
+#: scheduler/ipp.c:2536
+#, c-format
msgid "Bad device-uri scheme \"%s\"!"
-msgstr "device-uri スキーム“%s”が正しくありません!"
+msgstr "\"%s\" は無効な device-uri スキーマです!"
+
+#: scheduler/ipp.c:9887 scheduler/ipp.c:11362
+#, c-format
msgid "Bad document-format \"%s\"!"
-msgstr "document-format “%s”が正しくありません!"
+msgstr "\"%s\" は不正な document-format です!"
+
+#: cups/util.c:936
msgid "Bad filename buffer!"
-msgstr "ファイル名バッファが正しくありません!"
+msgstr "不正なファイル名バッファーです!"
+
+#: ppdc/ppdc-import.cxx:230
+#, c-format
msgid "Bad font attribute: %s\n"
-msgstr "フォント属性が正しくありません:%s\n"
+msgstr "不正なフォント属性: %s\n"
+
+#: scheduler/ipp.c:10482
msgid "Bad job-priority value!"
-msgstr "job-priority 値が正しくありません!"
+msgstr "不正な job-priority 値です!"
+
+#: scheduler/ipp.c:1453
+#, c-format
msgid "Bad job-sheets value \"%s\"!"
-msgstr "job-sheets 値“%s”が正しくありません!"
+msgstr "\"%s\" は不正な job-sheets 値です!"
+
+#: scheduler/ipp.c:1437
msgid "Bad job-sheets value type!"
-msgstr "job-sheets 値タイプが正しくありません!"
+msgstr "不正な job-sheets 値タイプ です!"
+
+#: scheduler/ipp.c:10512
msgid "Bad job-state value!"
-msgstr "job-state 値が正しくありません!"
+msgstr "不正な job-state 値です!"
+
+#: scheduler/ipp.c:3656 scheduler/ipp.c:4017 scheduler/ipp.c:6622
+#: scheduler/ipp.c:6764 scheduler/ipp.c:8034 scheduler/ipp.c:8315
+#: scheduler/ipp.c:9158 scheduler/ipp.c:9383 scheduler/ipp.c:9800
+#: scheduler/ipp.c:10375
+#, c-format
msgid "Bad job-uri attribute \"%s\"!"
-msgstr "job-uri 属性“%s”が正しくありません!"
+msgstr "\"%s\" は無効な job-uri 属性です!"
+
+#: scheduler/ipp.c:2117 scheduler/ipp.c:6169
+#, c-format
msgid "Bad notify-pull-method \"%s\"!"
-msgstr "notify-pull-method “%s”が正しくありません!"
+msgstr "\"%s\" は無効な notify-pull-method です!"
+
+#: scheduler/ipp.c:2081 scheduler/ipp.c:6133
+#, c-format
msgid "Bad notify-recipient-uri URI \"%s\"!"
-msgstr "notify-recipient-uri URI “%s”が正しくありません!"
+msgstr "URI \"%s\" は不正な notify-recipient-uri です!"
+
+#: scheduler/ipp.c:1469
+#, c-format
msgid "Bad number-up value %d."
-msgstr "number-up 値 %d が正しくありません。"
+msgstr "%d は不正な number-up 値です。"
+
+#: cups/adminutil.c:303
+#, c-format
msgid "Bad option + choice on line %d!"
-msgstr "行 %d のオプションと選択が正しくありません!"
+msgstr "%d 行に不正なオプションと選択があります!"
+
+#: scheduler/ipp.c:1486
+#, c-format
msgid "Bad page-ranges values %d-%d."
-msgstr "page-ranges 値 %d 〜 %d が正しくありません。"
+msgstr "%d-%d は不正な page-ranges 値です。"
+
+#: scheduler/ipp.c:2580
+#, c-format
msgid "Bad port-monitor \"%s\"!"
-msgstr "port-monitor “%s”が正しくありません!"
+msgstr "\"%s\" は無効な port-monitor です!"
+
+#: scheduler/ipp.c:2628
+#, c-format
msgid "Bad printer-state value %d!"
-msgstr "printer-state 値 %d が正しくありません!"
+msgstr "%d は無効な printer-state 値です!"
+
+#: scheduler/ipp.c:298
+#, c-format
msgid "Bad request version number %d.%d!"
-msgstr "要求バージョン番号 %d.%d が正しくありません!"
+msgstr "バージョン番号 %d.%d は無効なリクエストです!"
+
+#: cgi-bin/admin.c:1377
msgid "Bad subscription ID!"
-msgstr "照会先 ID が正しくありません!"
+msgstr "不正なサブスクリプション ID です!"
+
+#: cgi-bin/admin.c:3289 cgi-bin/admin.c:3512
msgid "Banners"
msgstr "バナー"
+
+#: filter/bannertops.c:662
msgid "Billing Information: "
-msgstr "請求情報:"
+msgstr "課金情報: "
+
+#: ppdc/sample.c:259
msgid "Bond Paper"
msgstr "ボンド紙"
+
+#: ppdc/sample.c:56
msgid "C0 Envelope"
-msgstr "C0 封筒"
+msgstr "C0 Envelope"
+
+#: ppdc/sample.c:57
msgid "C1 Envelope"
-msgstr "C1 封筒"
+msgstr "C1 Envelope"
+
+#: ppdc/sample.c:58
msgid "C2 Envelope"
-msgstr "C2 封筒"
+msgstr "C2 Envelope"
+
+#: ppdc/sample.c:59
msgid "C3 Envelope"
-msgstr "C3 封筒"
+msgstr "C3 Envelope"
+
+#: ppdc/sample.c:46
msgid "C4"
msgstr "C4"
+
+#: ppdc/sample.c:60
msgid "C4 Envelope"
-msgstr "C4 封筒"
+msgstr "C4 Envelope"
+
+#: ppdc/sample.c:47
msgid "C5"
msgstr "C5"
+
+#: ppdc/sample.c:61
msgid "C5 Envelope"
-msgstr "C5 封筒"
+msgstr "C5 Envelope"
+
+#: ppdc/sample.c:48
msgid "C6"
msgstr "C6"
+
+#: ppdc/sample.c:63
msgid "C6 Envelope"
-msgstr "C6 封筒"
+msgstr "C6 Envelope"
+
+#: ppdc/sample.c:62
msgid "C65 Envelope"
-msgstr "C65 封筒"
+msgstr "C65 Envelope"
+
+#: ppdc/sample.c:64
msgid "C7 Envelope"
-msgstr "C7 封筒"
+msgstr "C7 Envelope"
+
+#: ppdc/sample.c:226
msgid "CMYK"
msgstr "CMYK"
+
+#: ppdc/sample.c:335
msgid "CPCL Label Printer"
-msgstr "CPCL ラベルプリンタ"
+msgstr "CPCL Label Printer"
+
+#: cgi-bin/admin.c:1378 cgi-bin/admin.c:1417 cgi-bin/admin.c:1427
msgid "Cancel RSS Subscription"
-msgstr "RSS 照会先をキャンセル"
+msgstr "RSS 購読をキャンセル"
+
+#: cgi-bin/admin.c:1596 cgi-bin/admin.c:1760 cgi-bin/admin.c:1772
+#: cgi-bin/admin.c:1783
msgid "Change Settings"
-msgstr "設定を変更"
+msgstr "設定の変更"
+
+#: scheduler/ipp.c:2129 scheduler/ipp.c:6181
+#, c-format
msgid "Character set \"%s\" not supported!"
-msgstr "文字セット“%s”には対応していません!"
+msgstr "文字セット \"%s\" はサポートされていません!"
+
+#: ppdc/sample.c:65
msgid "Chou3 Envelope"
-msgstr "長 3 封筒"
+msgstr "封筒 長形3号"
+
+#: ppdc/sample.c:66
msgid "Chou4 Envelope"
-msgstr "長 4 封筒"
+msgstr "封筒 長形4号"
+
+#: cgi-bin/classes.c:180 cgi-bin/classes.c:307
msgid "Classes"
msgstr "クラス"
+
+#: cgi-bin/printers.c:167
msgid "Clean Print Heads"
-msgstr "印字ヘッドを清掃"
+msgstr "プリントヘッドクリーニング"
+
+#: ppdc/sample.c:253
msgid "Color"
msgstr "カラー"
+
+#: ppdc/sample.c:225
msgid "Color Mode"
msgstr "カラーモード"
-msgid "Commands may be abbreviated. Commands are:\n\nexit help quit status ?\n"
-msgstr "コマンドは短縮形でもかまいません。コマンド:\n\nexit help quit status ?\n"
+
+#: berkeley/lpc.c:209
+msgid ""
+"Commands may be abbreviated. Commands are:\n"
+"\n"
+"exit help quit status ?\n"
+msgstr ""
+"コマンドは短縮できます。 コマンド:\n"
+"\n"
+"exit help quit status ?\n"
+
+#: cups/snmp.c:1005
msgid "Community name uses indefinite length"
-msgstr "コミュニティ名に使われている長さが不定です"
+msgstr "コミュニティ名の長さが不定"
+
+#: cups/http-support.c:1182
msgid "Continue"
-msgstr "続ける"
+msgstr "継続"
+
+#: ppdc/sample.c:337
msgid "Continuous"
msgstr "連続"
+
+#: scheduler/ipp.c:8608 scheduler/ipp.c:8624 scheduler/ipp.c:9903
+#, c-format
msgid "Could not scan type \"%s\"!"
-msgstr "タイプ“%s”をスキャンできませんでした!"
+msgstr "タイプ \"%s\" を検査できませんでした!"
+
+#: backend/ipp.c:1668
msgid "Cover open."
msgstr "カバーが開いています。"
+
+#: cups/http-support.c:1191
msgid "Created"
-msgstr "作成済み"
+msgstr "ジョブ作成"
+
+#: filter/bannertops.c:850
msgid "Created On: "
-msgstr "作成日時:"
+msgstr "ジョブ作成日: "
+
+#: cups/ppd.c:1068 cups/ppd.c:1108 cups/ppd.c:1322 cups/ppd.c:1425
msgid "Custom"
msgstr "カスタム"
+
+#: ppdc/sample.c:331
msgid "CustominCutInterval"
msgstr "CustominCutInterval"
+
+#: ppdc/sample.c:329
msgid "CustominTearInterval"
msgstr "CustominTearInterval"
+
+#: ppdc/sample.c:315
msgid "Cut"
msgstr "カット"
+
+#: ppdc/sample.c:423
msgid "Cutter"
msgstr "カッター"
+
+#: ppdc/sample.c:49
msgid "DL"
msgstr "DL"
+
+#: ppdc/sample.c:67
msgid "DL Envelope"
-msgstr "DL 封筒"
+msgstr "DL Envelope"
+
+#: ppdc/sample.c:211
msgid "Dark"
msgstr "濃い"
+
+#: ppdc/sample.c:207
msgid "Darkness"
msgstr "濃さ"
+
+#: cgi-bin/admin.c:2056 cgi-bin/admin.c:2067 cgi-bin/admin.c:2112
msgid "Delete Class"
-msgstr "クラスを削除"
+msgstr "クラスの削除"
+
+#: cgi-bin/admin.c:2141 cgi-bin/admin.c:2152 cgi-bin/admin.c:2197
msgid "Delete Printer"
-msgstr "プリンタを削除"
+msgstr "プリンターの削除"
+
+#: filter/bannertops.c:731
msgid "Description: "
-msgstr "説明:"
+msgstr "説明: "
+
+#: ppdc/sample.c:252
msgid "DeskJet Series"
-msgstr "DeskJet シリーズ"
+msgstr "DeskJet Series"
+
+#: scheduler/ipp.c:1389
+#, c-format
msgid "Destination \"%s\" is not accepting jobs."
-msgstr "送信先“%s”がジョブを受け入れません。"
+msgstr "宛先 \"%s\" はジョブを受け付けていません。"
+
+#: backend/ipp.c:1702
msgid "Developer almost empty."
-msgstr "現像液がもうすぐ空になります。"
+msgstr "現像剤が無くなりかけています。"
+
+#: backend/ipp.c:1704
msgid "Developer empty!"
-msgstr "現像液が空です!"
-msgid "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n"
-msgstr "デバイス:uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n"
+msgstr "現像剤が無くなりました!"
+
+#: systemv/lpinfo.c:305
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+" location = %s\n"
+msgstr ""
+"デバイス: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+" location = %s\n"
+
+#: ppdc/sample.c:408
msgid "Direct Thermal Media"
-msgstr "直接感熱メディア"
+msgstr "感熱紙"
+
+#: ppdc/sample.c:317
msgid "Disabled"
msgstr "無効"
+
+#: scheduler/ipp.c:6669
+#, c-format
msgid "Document %d not found in job %d."
-msgstr "書類 %d がジョブ %d 内で見つかりませんでした。"
+msgstr "ドキュメント %d がジョブ %d に見つかりません。"
+
+#: backend/ipp.c:1672
msgid "Door open."
msgstr "ドアが開いています。"
+
+#: ppdc/sample.c:50
msgid "Double Postcard"
msgstr "往復はがき"
+
+#: filter/bannertops.c:816
msgid "Driver Name: "
-msgstr "ドライバ名:"
+msgstr "ドライバー名: "
+
+#: filter/bannertops.c:827
msgid "Driver Version: "
-msgstr "ドライバのバージョン:"
+msgstr "ドライバーバージョン: "
+
+#: ppdc/sample.c:247
msgid "Duplexer"
-msgstr "両面印刷機構"
+msgstr "両面オプション"
+
+#: ppdc/sample.c:201
msgid "Dymo"
msgstr "Dymo"
+
+#: filter/pstops.c:443
+#, c-format
msgid "EMERG: Unable to allocate memory for page info: %s\n"
-msgstr "EMERG: ページ情報にメモリを割り当てることができません:%s\n"
+msgstr "EMERG: ページ情報のメモリー割り当てができません: %s\n"
+
+#: filter/pstops.c:436
+#, c-format
msgid "EMERG: Unable to allocate memory for pages array: %s\n"
-msgstr "EMERG: ページ配列にメモリを割り当てることができません:%s\n"
+msgstr "EMERG: ページアレイのメモリー割り当てができません: %s\n"
+
+#: ppdc/sample.c:403
msgid "EPL1 Label Printer"
-msgstr "EPL1 ラベルプリンタ"
+msgstr "EPL1 Label Printer"
+
+#: ppdc/sample.c:406
msgid "EPL2 Label Printer"
-msgstr "EPL2 ラベルプリンタ"
+msgstr "EPL2 Label Printer"
+
+#: filter/pstops.c:703
+#, c-format
msgid "ERROR: Bad %%BoundingBox: comment seen!\n"
-msgstr "ERROR: %%BoundingBox が正しくありません:コメントがあります!\n"
+msgstr "ERROR: 不正な %%BoundingBox: コメントがあります!\n"
+
+#: filter/pstops.c:2210
+#, c-format
msgid "ERROR: Bad %%IncludeFeature: comment!\n"
-msgstr "ERROR: %%IncludeFeature が正しくありません:コメント!\n"
+msgstr "ERROR: 不正な %%IncludeFeature: コメントです!\n"
+
+#: filter/pstops.c:1280 filter/pstops.c:1286
+#, c-format
msgid "ERROR: Bad %%Page: comment in file!\n"
-msgstr "ERROR: %%Page が正しくありません:ファイルにコメントがあります!\n"
+msgstr "ERROR: 不正な %%Page: コメントがファイルにあります!\n"
+
+#: filter/pstops.c:1356
+#, c-format
msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n"
-msgstr "ERROR: %%PageBoundingBox が正しくありません:ファイルにコメントがあります!\n"
+msgstr "ERROR: 不正な %%PageBoundingBox: コメントがファイルにあります!\n"
+
+#: backend/scsi-irix.c:100 backend/scsi-linux.c:114
+#, c-format
msgid "ERROR: Bad SCSI device file \"%s\"!\n"
-msgstr "ERROR: SCSI デバイスファイル“%s”が正しくありません!\n"
+msgstr "ERROR: 不正な SCSI デバイスファイル \"%s\" です!\n"
+
+#: filter/pstext.c:276 filter/texttops.c:284 filter/texttops.c:295
+#, c-format
msgid "ERROR: Bad charset file %s\n"
-msgstr "ERROR: 文字セットファイル %s が正しくありません\n"
+msgstr "ERROR: 不正な charset ファイル %s です\n"
+
+#: filter/texttops.c:453
+#, c-format
msgid "ERROR: Bad charset type %s\n"
-msgstr "ERROR: 文字セットタイプ %s が正しくありません\n"
+msgstr "ERROR: 不正な charset タイプ %s です\n"
+
+#: filter/textcommon.c:613
+#, c-format
msgid "ERROR: Bad columns value %d!\n"
-msgstr "ERROR: 列値 %d が正しくありません!\n"
+msgstr "ERROR: 不正な columns 値 %d です!\n"
+
+#: filter/textcommon.c:624
+#, c-format
msgid "ERROR: Bad cpi value %f!\n"
-msgstr "ERROR: cpi 値 %f が正しくありません!\n"
+msgstr "ERROR: 不正な cpi 値 %f です!\n"
+
+#: filter/pstext.c:320 filter/pstext.c:357 filter/texttops.c:348
+#: filter/texttops.c:384
+#, c-format
msgid "ERROR: Bad font description line: %s\n"
-msgstr "ERROR: フォント説明行が正しくありません:%s\n"
+msgstr "ERROR: 不正なフォント記述行: %s\n"
+
+#: filter/textcommon.c:635
+#, c-format
msgid "ERROR: Bad lpi value %f!\n"
-msgstr "ERROR: lpi 値 %f が正しくありません!\n"
+msgstr "ERROR: 不正な lpi 値 %f です!\n"
+
+#: filter/imagetoraster.c:460
msgid "ERROR: Bad page setup!\n"
-msgstr "ERROR: ページ設定が正しくありません!\n"
+msgstr "ERROR: 不正なページ設定です!\n"
+
+#: filter/pstext.c:334 filter/texttops.c:361
+#, c-format
msgid "ERROR: Bad text direction %s\n"
-msgstr "ERROR: テキスト方向 %s が正しくありません\n"
+msgstr "ERROR: 不正な テキスト方向 %s です\n"
+
+#: filter/pstext.c:371 filter/texttops.c:397
+#, c-format
msgid "ERROR: Bad text width %s\n"
-msgstr "ERROR: テキスト幅 %s が正しくありません\n"
+msgstr "ERROR: 不正な テキスト幅 %s です\n"
+
+#: backend/ipp.c:735
msgid "ERROR: Destination printer does not exist!\n"
-msgstr "ERROR: 送信先プリンタが存在しません!\n"
+msgstr "ERROR: 送信先のプリンターが存在しません!\n"
+
+#: filter/pstops.c:692
+#, c-format
msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n"
-msgstr "ERROR: %%BoundingBox が重複しています:コメントがあります!\n"
+msgstr "ERROR: 重複した %%BoundingBox: コメントがあります!\n"
+
+#: filter/pstops.c:645
+#, c-format
msgid "ERROR: Duplicate %%Pages: comment seen!\n"
-msgstr "ERROR: %%Pages が重複しています:コメントがあります!\n"
+msgstr "ERROR: 重複した %%Pages: コメントがあります!\n"
+
+#: backend/ipp.c:457 filter/pstops.c:302
msgid "ERROR: Empty print file!\n"
-msgstr "ERROR: プリントファイルが空です!\n"
+msgstr "ERROR: 空のプリントファイルです!\n"
+
+#: backend/pap.c:838
+#, c-format
msgid "ERROR: Error %d sending PAPSendData request: %s\n"
-msgstr "ERROR: PAPSendData 要求を送信中のエラー %d:%s\n"
+msgstr "ERROR: エラー %d PAPSendData request の送信: %s\n"
+
+#: ppdc/ppdc-catalog.cxx:335 ppdc/ppdc-catalog.cxx:347
+#, c-format
msgid "ERROR: Expected quoted string on line %d of %s!\n"
-msgstr "ERROR: %2$s の行 %1$d に引用文字列が必要です!\n"
+msgstr "ERROR: %d 行: %s には引用符で囲まれた文字列が必要です!\n"
+
+#: backend/usb-darwin.c:364 backend/usb-darwin.c:422 backend/usb-darwin.c:487
+#: backend/usb-darwin.c:505
msgid "ERROR: Fatal USB error!\n"
-msgstr "ERROR: 致命的な USB エラー!\n"
+msgstr "ERROR: 致命的な USB エラーです!\n"
+
+#: filter/hpgl-input.c:139
msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n"
-msgstr "ERROR: 無効な HP-GL/2 コマンドがあるため、ファイルをプリントできません!\n"
+msgstr "ERROR: 無効な HP-GL/2 コマンドがあり、ファイルをプリントできません!\n"
+
+#: filter/pstops.c:1764
+#, c-format
msgid "ERROR: Missing %%EndProlog!\n"
-msgstr "ERROR: %%EndProlog がありません!\n"
+msgstr "ERROR: %%EndProlog が見つかりません!\n"
+
+#: filter/pstops.c:1835
+#, c-format
msgid "ERROR: Missing %%EndSetup!\n"
-msgstr "ERROR: %%EndSetup がありません!\n"
+msgstr "ERROR: %%EndSetup が見つかりません!\n"
+
+#: backend/ipp.c:243
msgid "ERROR: Missing device URI on command-line and no DEVICE_URI environment variable!\n"
-msgstr "ERROR: コマンドラインにデバイス URI が入力されていないので、DEVICE_URI 環境変数がありません!\n"
+msgstr "ERROR: コマンドラインにデバイス URI が見つからず、環境変数 DEVICE_URI も見つかりません!\n"
+
+#: filter/bannertops.c:222
+#, c-format
msgid "ERROR: Missing value on line %d of banner file!\n"
-msgstr "ERROR: バナーファイルの行 %d に値がありません!\n"
+msgstr "ERROR: バナーファイルの %d 行目に値が見つかりません!\n"
+
+#: ppdc/ppdc-catalog.cxx:412
+#, c-format
msgid "ERROR: Need a msgid line before any translation strings on line %d of %s!\n"
-msgstr "ERROR: %2$s の行 %1$d の変換文字列の前に msgid 行が必要です!\n"
+msgstr "ERROR: %d 行: %s の翻訳文字列の前に msgid 行が必要です!\n"
+
+#: filter/pstops.c:755
+#, c-format
msgid "ERROR: No %%BoundingBox: comment in header!\n"
-msgstr "ERROR: %%BoundingBox がありません:ヘッダにコメントがあります!\n"
+msgstr "ERROR: %%BoundingBox: コメントがありません!\n"
+
+#: filter/pstops.c:758
+#, c-format
msgid "ERROR: No %%Pages: comment in header!\n"
-msgstr "ERROR: %%Pages がありません:ヘッダにコメントがあります!\n"
+msgstr "ERROR: %%Pages: コメントがヘッダーにありません!\n"
+
+#: backend/usb.c:200
msgid "ERROR: No device URI found in argv[0] or in DEVICE_URI environment variable!\n"
-msgstr "ERROR: argv[0] または DEVICE_URI 環境変数にデバイス URI が見つかりませんでした!\n"
+msgstr "ERROR: argv[0] または 環境変数 DEVICE_URI にデバイス URI が見つかりません!\n"
+
+#: filter/pstext.c:433
+#, c-format
msgid "ERROR: No fonts in charset file %s\n"
-msgstr "ERROR: 文字セットファイル %s 内にフォントがありません\n"
+msgstr "ERROR: charset ファイル %s にフォントが見つかりません\n"
+
+#: filter/rastertoepson.c:1124 filter/rastertohp.c:854
+#: filter/rastertolabel.c:1279
msgid "ERROR: No pages found!\n"
-msgstr "ERROR: ページが見つかりませんでした!\n"
+msgstr "ERROR: ページが見つかりません!\n"
+
+#: backend/runloop.c:348
msgid "ERROR: Out of paper!\n"
-msgstr "ERROR: 用紙がありません!\n"
+msgstr "ERROR: 用紙切れです!\n"
+
+#: backend/ipp.c:1792
msgid "ERROR: PRINTER environment variable not defined!\n"
-msgstr "ERROR: PRINTER 環境設定が定義されていません!\n"
+msgstr "ERROR: PRINTER 環境変数が定義されていません!\n"
+
+#: backend/ipp.c:1044
+#, c-format
msgid "ERROR: Print file was not accepted (%s)!\n"
-msgstr "ERROR: プリントファイルが受け入れられませんでした(%s)!\n"
+msgstr "ERROR: プリントファイルが受け付けられませんでした (%s)!\n"
+
+#: backend/pap.c:521
msgid "ERROR: Printer not responding\n"
-msgstr "ERROR: プリンタが応答しません\n"
+msgstr "ERROR: プリンターが応答していません\n"
+
+#: backend/ipp.c:571 backend/ipp.c:702 backend/lpd.c:821 backend/socket.c:311
msgid "ERROR: Printer not responding!\n"
-msgstr "ERROR: プリンタが応答しません!\n"
+msgstr "ERROR: プリンターが応答していません!\n"
+
+#: backend/pap.c:858
msgid "ERROR: Printer sent unexpected EOF\n"
-msgstr "ERROR: プリンタから予期しない EOF を受け取りました\n"
+msgstr "ERROR: プリンターが 想定外の EOF を送信しました\n"
+
+#: backend/lpd.c:1025 backend/lpd.c:1172
+#, c-format
msgid "ERROR: Remote host did not accept control file (%d)\n"
-msgstr "ERROR: リモートホストが制御ファイルを受け入れませんでした(%d)\n"
+msgstr "ERROR: リモートホストがコントロールファイルを受け付けませんでした (%d)\n"
+
+#: backend/lpd.c:1120
+#, c-format
msgid "ERROR: Remote host did not accept data file (%d)\n"
-msgstr "ERROR: リモートホストがデータファイルを受け入れませんでした(%d)\n"
+msgstr "ERROR: リモートホストがデータファイルを受け付けませんでした (%d)\n"
+
+#: backend/pap.c:1694
msgid "ERROR: There was a timeout error while sending data to the printer\n"
-msgstr "ERROR: プリンタにデータを送信しているときにタイムアウトエラーが起きました\n"
+msgstr "ERROR: プリンターへのデータ送信中にタイムアウトエラーが発生しました\n"
+
+#: backend/ipp.c:1107
+#, c-format
msgid "ERROR: Unable to add file %d to job: %s\n"
-msgstr "ERROR: ファイル %d をジョブに追加できません:%s\n"
+msgstr "ERROR: ファイル %d をジョブに追加できません: %s\n"
+
+#: backend/ipp.c:1355
+#, c-format
msgid "ERROR: Unable to cancel job %d: %s\n"
-msgstr "ERROR: ジョブ %d をキャンセルできません:%s\n"
+msgstr "ERROR: ジョブ %d をキャンセルできません: %s\n"
+
+#: filter/pdftops.c:126
msgid "ERROR: Unable to copy PDF file"
msgstr "ERROR: PDF ファイルをコピーできません"
+
+#: backend/lpd.c:745
msgid "ERROR: Unable to create socket"
msgstr "ERROR: ソケットを作成できません"
+
+#: backend/ipp.c:1445
+#, c-format
msgid "ERROR: Unable to create temporary compressed print file: %s\n"
-msgstr "ERROR: 圧縮された一時プリントファイルを作成できません:%s\n"
+msgstr "ERROR: テンポラリーの圧縮プリントファイルを作成できません: %s\n"
+
+#: backend/ipp.c:424 backend/lpd.c:433
msgid "ERROR: Unable to create temporary file"
-msgstr "ERROR: 一時ファイルを作成できません"
+msgstr "ERROR: テンポラリーファイルを作成できません"
+
+#: backend/ipp.c:1814
+#, c-format
msgid "ERROR: Unable to create temporary file - %s.\n"
-msgstr "ERROR: 一時ファイルを作成できません - %s。\n"
+msgstr "ERROR: テンポラリーファイルを作成できません - %s\n"
+
+#: filter/pstops.c:2708
+#, c-format
msgid "ERROR: Unable to create temporary file: %s\n"
-msgstr "ERROR: 一時ファイルを作成できません:%s\n"
+msgstr "ERROR: テンポラリーファイルを作成できません: %s\n"
+
+#: backend/ipp.c:1871
+#, c-format
msgid "ERROR: Unable to exec pictwpstops: %s\n"
-msgstr "ERROR: pictwpstops を実行できません:%s\n"
+msgstr "ERROR: pictwpstops を実行できません: %s\n"
+
+#: filter/pdftops.c:317 filter/pdftops.c:331
msgid "ERROR: Unable to execute gs program"
msgstr "ERROR: gs プログラムを実行できません"
+
+#: filter/pdftops.c:314 filter/pdftops.c:329
msgid "ERROR: Unable to execute pdftops program"
msgstr "ERROR: pdftops プログラムを実行できません"
+
+#: backend/ipp.c:1884
+#, c-format
msgid "ERROR: Unable to fork pictwpstops: %s\n"
-msgstr "ERROR: pictwpstops を分岐できません:%s\n"
+msgstr "ERROR: pictwpstops をフォークできません: %s\n"
+
+#: backend/pap.c:712
msgid "ERROR: Unable to get PAP request"
-msgstr "ERROR: PAP 要求を取得できません"
+msgstr "ERROR: PAP リクエストを取得できません"
+
+#: backend/pap.c:701
msgid "ERROR: Unable to get PAP response"
-msgstr "ERROR: PAP 応答を取得できません"
+msgstr "ERROR: PAP レスポンスを取得できません"
+
+#: backend/ipp.c:1799
+#, c-format
msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"
-msgstr "ERROR: プリンタ“%s”のPPD ファイルを取得できません - %s。\n"
+msgstr "ERROR: プリンター \"%s\" の PPD ファイルを取得できません - %s\n"
+
+#: backend/pap.c:302
msgid "ERROR: Unable to get default AppleTalk zone"
msgstr "ERROR: デフォルトの AppleTalk ゾーンを取得できません"
+
+#: backend/ipp.c:1194
+#, c-format
msgid "ERROR: Unable to get job %d attributes (%s)!\n"
-msgstr "ERROR: ジョブ %d の属性を取得できません(%s)!\n"
+msgstr "ERROR: ジョブ %d の属性 (%s) を取得できません!\n"
+
+#: backend/ipp.c:745
+#, c-format
msgid "ERROR: Unable to get printer status (%s)!\n"
-msgstr "ERROR: プリンタの状況を取得できません(%s)!\n"
+msgstr "ERROR: プリンターのステータス (%s) を取得できません!\n"
+
+#: backend/ipp.c:589 backend/lpd.c:677 backend/socket.c:266
+#, c-format
msgid "ERROR: Unable to locate printer '%s'!\n"
-msgstr "ERROR: プリンタ‘%s’を特定できません!\n"
+msgstr "ERROR: プリンター '%s' が見つかりません\"!\n"
+
+#: backend/pap.c:688
msgid "ERROR: Unable to look for PAP response"
-msgstr "ERROR: PAP 応答を検索できません"
+msgstr "ERROR: PAP レスポンスが見つかりません"
+
+#: backend/pap.c:322
msgid "ERROR: Unable to lookup AppleTalk printers"
-msgstr "ERROR: AppleTalk プリンタを検索できません"
+msgstr "ERROR: AppleTalk プリンターが見つかりません"
+
+#: backend/pap.c:451
msgid "ERROR: Unable to make AppleTalk address"
msgstr "ERROR: AppleTalk アドレスを作成できません"
+
+#: filter/pstext.c:247 filter/texttops.c:248
+#, c-format
msgid "ERROR: Unable to open \"%s\" - %s\n"
-msgstr "ERROR: “%s”を開けません - %s\n"
+msgstr "ERROR: \"%s\" を開けません - %s\n"
+
+#: filter/pstext.c:264 filter/texttops.c:268
+#, c-format
msgid "ERROR: Unable to open %s: %s\n"
-msgstr "ERROR: %s を開けません:%s\n"
+msgstr "ERROR: %s を開けません: %s\n"
+
+#: filter/bannertops.c:184
+#, c-format
msgid "ERROR: Unable to open banner file \"%s\" - %s\n"
-msgstr "ERROR: バナーファイル“%s”を開けません - %s\n"
+msgstr "ERROR: バナーファイル \"%s\" を開けません - %s\n"
+
+#: backend/parallel.c:249 backend/scsi-irix.c:140 backend/scsi-linux.c:154
+#: backend/serial.c:262 backend/usb-unix.c:146
+#, c-format
msgid "ERROR: Unable to open device file \"%s\": %s\n"
-msgstr "ERROR: デバイスファイル“%s”を開けません:%s\n"
+msgstr "ERROR: デバイスファイル \"%s\" を開けません: %s\n"
+
+#: filter/pstops.c:290
+#, c-format
msgid "ERROR: Unable to open file \"%s\" - %s\n"
-msgstr "ERROR: ファイル“%s”を開けません - %s\n"
+msgstr "ERROR: ファイル \"%s\" を開けません - %s\n"
+
+#: filter/gziptoany.c:74
+#, c-format
msgid "ERROR: Unable to open file \"%s\": %s\n"
-msgstr "ERROR: ファイル“%s”を開けません:%s\n"
+msgstr "ERROR: ファイル \"%s\" を開けません: %s\n"
+
+#: filter/imagetops.c:313 filter/imagetoraster.c:637
msgid "ERROR: Unable to open image file for printing!\n"
-msgstr "ERROR: プリント用のイメージファイルを開けません!\n"
+msgstr "ERROR: 印刷のためのイメージファイルを開けません!\n"
+
+#: backend/ipp.c:1461 backend/pap.c:249 backend/parallel.c:151
+#: backend/scsi.c:181 backend/serial.c:189 backend/socket.c:156
+#, c-format
msgid "ERROR: Unable to open print file \"%s\": %s\n"
-msgstr "ERROR: プリントファイル“%s”を開けません:%s\n"
+msgstr "ERROR: プリントファイル \"%s\" を開けません: %s\n"
+
+#: backend/usb.c:237
+#, c-format
msgid "ERROR: Unable to open print file %s - %s\n"
msgstr "ERROR: プリントファイル %s を開けません - %s\n"
+
+#: backend/lpd.c:462
+#, c-format
msgid "ERROR: Unable to open print file %s: %s\n"
-msgstr "ERROR: プリントファイル %s を開けません:%s\n"
+msgstr "ERROR: プリントファイル %s を開けません: %s\n"
+
+#: backend/ipp.c:1453
+#, c-format
msgid "ERROR: Unable to open temporary compressed print file: %s\n"
-msgstr "ERROR: 圧縮された一時プリントファイルを開けません:%s\n"
+msgstr "ERROR: テンポラリーの圧縮プリントファイルを開けません: %s\n"
+
+#: backend/ipp.c:430
msgid "ERROR: Unable to open temporary file"
-msgstr "ERROR: 一時ファイルを開けません"
+msgstr "ERROR: テンポラリーファイルを開けません"
+
+#: filter/texttops.c:200
+#, c-format
msgid "ERROR: Unable to print %d text columns!\n"
-msgstr "ERROR: %d 個のテキスト列をプリントできません!\n"
+msgstr "ERROR: テキストカラム %d をプリントできません!\n"
+
+#: filter/texttops.c:179
+#, c-format
msgid "ERROR: Unable to print %dx%d text page!\n"
-msgstr "ERROR: %d x %d のテキストページをプリントできません!\n"
+msgstr "ERROR: テキストページ %dx%d をプリントできません!\n"
+
+#: backend/serial.c:615
msgid "ERROR: Unable to read print data"
-msgstr "ERROR: プリントデータを読み取れません"
+msgstr "ERROR: プリントデータを読み込めません"
+
+#: backend/usb-darwin.c:589 backend/usb-darwin.c:622
msgid "ERROR: Unable to read print data!\n"
-msgstr "ERROR: プリントデータを読み取れません!\n"
+msgstr "ERROR: プリントデータを読み込めません!\n"
+
+#: backend/lpd.c:762
msgid "ERROR: Unable to reserve port"
msgstr "ERROR: ポートを予約できません"
+
+#: filter/pstops.c:560
+#, c-format
msgid "ERROR: Unable to seek to offset %ld in file - %s\n"
-msgstr "ERROR: ファイル内のオフセット %ld にシークできません - %s\n"
+msgstr "ERROR: ファイルでのオフセット %ld へシークできません - %s\n"
+
+#: filter/pstops.c:558
+#, c-format
msgid "ERROR: Unable to seek to offset %lld in file - %s\n"
-msgstr "ERROR: ファイル内のオフセット %lld にシークできません - %s\n"
+msgstr "ERROR: ファイルでのオフセット %lld へシークできません - %s\n"
+
+#: backend/lpd.c:578
msgid "ERROR: Unable to send LPD command"
msgstr "ERROR: LPD コマンドを送信できません"
+
+#: backend/pap.c:571
msgid "ERROR: Unable to send PAP tickle request"
-msgstr "ERROR: PAP チケット要求を送信できません"
+msgstr "ERROR: PAP tickle 要求を送信できません"
+
+#: backend/pap.c:580
msgid "ERROR: Unable to send initial PAP send data request"
-msgstr "ERROR: 初期 PAP データ送信要求を送信できません"
+msgstr "ERROR: PAP の初期データ送信要求を送信できません"
+
+#: backend/scsi-irix.c:219 backend/scsi-linux.c:237
+#, c-format
msgid "ERROR: Unable to send print data (%d)\n"
-msgstr "ERROR: プリントデータを送信できません(%d)\n"
+msgstr "ERROR: プリントデータを送信できません (%d)\n"
+
+#: backend/usb-darwin.c:665
msgid "ERROR: Unable to send print data!\n"
-msgstr "ERROR: プリントデータを送信できません!\n"
+msgstr "ERROR: プリントデータを送信できません!\n"
+
+#: backend/lpd.c:1076
msgid "ERROR: Unable to send print file to printer"
-msgstr "ERROR: プリントファイルをプリンタに送信できません"
+msgstr "ERROR: プリントファイルをプリンターへ送信できません"
+
+#: backend/lpd.c:1090
msgid "ERROR: Unable to send trailing nul to printer"
-msgstr "ERROR: 末尾の null をプリンタに送信できません"
+msgstr "ERROR: 最後の NUL をプリンターへ送信できません"
+
+#: backend/ipp.c:1897
+#, c-format
msgid "ERROR: Unable to wait for pictwpstops: %s\n"
-msgstr "ERROR: pictwpstops を待機できません:%s\n"
+msgstr "ERROR: pictwpstops を待つことができません: %s\n"
+
+#: backend/ipp.c:1472
+#, c-format
msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n"
-msgstr "ERROR: %d バイトを“%s”に書き込めません:%s\n"
+msgstr "ERROR: %d バイトを \"%s\" に書き込めません: %s\n"
+
+#: backend/usb-libusb.c:169 backend/usb-libusb.c:765
+#, c-format
msgid "ERROR: Unable to write %d bytes to printer!\n"
-msgstr "ERROR: %d バイトをプリンタに書き込めません!\n"
+msgstr "ERROR: %d バイトをプリンターに書き込めません!\n"
+
+#: backend/lpd.c:1006 backend/lpd.c:1153
msgid "ERROR: Unable to write control file"
-msgstr "ERROR: 制御ファイルに書き込めません"
+msgstr "ERROR: コントロールファイルを書き込めません"
+
+#: backend/serial.c:691
msgid "ERROR: Unable to write print data"
msgstr "ERROR: プリントデータを書き込めません"
+
+#: backend/runloop.c:122 backend/runloop.c:363
+#, c-format
msgid "ERROR: Unable to write print data: %s\n"
-msgstr "ERROR: プリントデータを書き込めません:%s\n"
+msgstr "ERROR: プリントデータを書き込めません: %s\n"
+
+#: filter/imagetoraster.c:1199 filter/imagetoraster.c:1295
+#: filter/imagetoraster.c:1335
msgid "ERROR: Unable to write raster data to driver!\n"
-msgstr "ERROR: ラスタデータをドライバに書き込めません!\n"
+msgstr "ERROR: ラスターデータをドライバーへ書き込めません!\n"
+
+#: backend/ipp.c:441 backend/lpd.c:440
msgid "ERROR: Unable to write to temporary file"
-msgstr "ERROR: 一時ファイルに書き込めません"
+msgstr "ERROR: テンポラリーファイルへ書き込めません"
+
+#: filter/gziptoany.c:96
+#, c-format
msgid "ERROR: Unable to write uncompressed document data: %s\n"
-msgstr "ERROR: 非圧縮書類データを書き込めません:%s\n"
+msgstr "ERROR: 非圧縮ドキュメントデータを書き込めません: %s\n"
+
+#: ppdc/ppdc-catalog.cxx:429
+#, c-format
msgid "ERROR: Unexpected text on line %d of %s!\n"
-msgstr "ERROR: %2$s の行 %1$d に予期しないテキストがあります!\n"
+msgstr "ERROR: %d 行: %s は予期せぬテキストです!\n"
+
+#: backend/ipp.c:351
+#, c-format
msgid "ERROR: Unknown encryption option value \"%s\"!\n"
-msgstr "ERROR: “%s”は不明な暗号化オプション値です!\n"
+msgstr "ERROR: \"%s\" は未知の暗号オプション値です!\n"
+
+#: backend/lpd.c:355
+#, c-format
msgid "ERROR: Unknown file order \"%s\"\n"
-msgstr "ERROR: “%s”は不明なファイル順序です\n"
+msgstr "ERROR: \"%s\" は未知のファイルオーダーです\n"
+
+#: backend/lpd.c:327
+#, c-format
msgid "ERROR: Unknown format character \"%c\"\n"
-msgstr "ERROR: “%c”は不明なフォーマット文字です\n"
+msgstr "ERROR: \"%c\" は未知の書式文字です\n"
+
+#: ppdc/ppdc-catalog.cxx:457
+#, c-format
msgid "ERROR: Unknown message catalog format for \"%s\"!\n"
-msgstr "ERROR: “%s”のメッセージ・カタログ・フォーマットが不明です!\n"
+msgstr "ERROR: \"%s\" は未知のメッセージカタログの書式です!\n"
+
+#: backend/ipp.c:397
+#, c-format
msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n"
-msgstr "ERROR: 値“%2$s”、オプション“%1$s”は不明です!\n"
+msgstr "ERROR: \"%s\" (値 \"%s\") は未知のオプションです!\n"
+
+#: backend/lpd.c:341
+#, c-format
msgid "ERROR: Unknown print mode \"%s\"\n"
-msgstr "ERROR: “%s”は不明なプリントモードです\n"
+msgstr "ERROR: \"%s\" は未知のプリントモードです\n"
+
+#: backend/ipp.c:368
+#, c-format
msgid "ERROR: Unknown version option value \"%s\"!\n"
-msgstr "ERROR: “%s”は不明なバージョンオプション値です!\n"
+msgstr "ERROR: \"%s\" は未知のバージョンオプション値です!\n"
+
+#: filter/pstops.c:2407
+#, c-format
msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n"
-msgstr "ERROR: 輝度値 %s に対応していないため、brightness=100 を使用します!\n"
+msgstr "ERROR: %s はサポートされていない輝度値です。brightness=100 を使用します!\n"
+
+#: filter/pstops.c:2476
+#, c-format
msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n"
-msgstr "ERROR: ガンマ値 %s に対応していないため、gamma=1000 を使用します!\n"
+msgstr "ERROR: %s はサポートされていないガンマ値です。gamma=1000 を使用します!\n"
+
+#: filter/pstops.c:2530
+#, c-format
msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n"
-msgstr "ERROR: number-up 値 %d に対応していないため、number-up=1 を使用します!\n"
+msgstr "ERROR: %d はサポートされていない number-up 値です。number-up=1 を使用します!\n"
+
+#: filter/pstops.c:2563
+#, c-format
msgid "ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n"
-msgstr "ERROR: number-up-layout 値 %s に対応していないため、number-up-layout=lrtb を使用します!\n"
+msgstr "ERROR: %s はサポートされていない number-up-layout 値です。number-up-layout=lrtb を使用します!\n"
+
+#: filter/pstops.c:2613
+#, c-format
msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n"
-msgstr "ERROR: page-border 値 %s に対応していないため、page-border=none を使用します!\n"
+msgstr "ERROR: %s はサポートされていない page-border 値です。page-border=none を使用します!\n"
+
+#: filter/pstops.c:2080
+#, c-format
msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n"
-msgstr "ERROR: doc_printf オーバーフロー(%d バイト)が検出されたため、中止しました!\n"
+msgstr "ERROR: doc_printf オーバーフロー (%d バイト) が検出され、中断しました!\n"
+
+#: filter/pdftops.c:370
+#, c-format
msgid "ERROR: pdftops filter crashed on signal %d!\n"
-msgstr "ERROR: シグナル %d で pdftops フィルタがクラッシュしました!\n"
+msgstr "ERROR: pdftops フィルターはシグナル %d で異常終了しました!\n"
+
+#: filter/pdftops.c:362
+#, c-format
msgid "ERROR: pdftops filter exited with status %d!\n"
-msgstr "ERROR: 状況 %d で pdftops フィルタが終了しました!\n"
+msgstr "ERROR: pdftops フィルターは状態 %d で終了しました!\n"
+
+#: backend/ipp.c:1916
+#, c-format
msgid "ERROR: pictwpstops exited on signal %d!\n"
-msgstr "ERROR: シグナル %d で pictwpstops が終了しました!\n"
+msgstr "ERROR: pictwpstops はシグナル %d で終了しました!\n"
+
+#: backend/ipp.c:1913
+#, c-format
msgid "ERROR: pictwpstops exited with status %d!\n"
-msgstr "ERROR: 状況 %d で pictwpstops フィルタが終了しました!\n"
+msgstr "ERROR: pictwpstops は状態 %d で終了しました!\n"
+
+#: backend/ipp.c:599 backend/lpd.c:850 backend/socket.c:334
msgid "ERROR: recoverable: Unable to connect to printer; will retry in 30 seconds...\n"
-msgstr "ERROR: 回復可能:プリンタに接続できません。30 秒後に再試行します...\n"
+msgstr "ERROR: 回復可能: プリンターに接続できません。30 秒後に再試行します...\n"
+
+#: backend/pap.c:629
msgid "ERROR: select() failed"
-msgstr "ERROR: select() に失敗しました"
+msgstr "ERROR: select() が失敗しました"
+
+#: backend/lpd.c:913
msgid "ERROR: unable to stat print file"
-msgstr "ERROR: プリントファイルの統計情報を取得できません"
+msgstr "ERROR: プリントファイルの状態を取得できません"
+
+#: cgi-bin/admin.c:1811 cgi-bin/admin.c:1823 cgi-bin/admin.c:1877
+#: cgi-bin/admin.c:1884 cgi-bin/admin.c:1919 cgi-bin/admin.c:1932
+#: cgi-bin/admin.c:1956 cgi-bin/admin.c:2029
msgid "Edit Configuration File"
-msgstr "構成ファイルを編集"
+msgstr "設定ファイルの編集"
+
+#: cups/adminutil.c:348
msgid "Empty PPD file!"
-msgstr "PPD ファイルが空です!"
+msgstr "PPD ファイルが空です!"
+
+#: cgi-bin/admin.c:3533
msgid "Ending Banner"
msgstr "終了バナー"
+
+#: systemv/lppasswd.c:205
msgid "Enter old password:"
-msgstr "古いパスワードを入力:"
+msgstr "古いパスワードを入力:"
+
+#: systemv/lppasswd.c:234
msgid "Enter password again:"
-msgstr "もう一度パスワードを入力:"
+msgstr "パスワードを再度入力:"
+
+#: systemv/lppasswd.c:223
msgid "Enter password:"
-msgstr "パスワードを入力:"
+msgstr "パスワードを入力:"
+
+#: scheduler/client.c:2409
msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
-msgstr "このページにアクセスするには、自分のユーザ名とパスワード、またはルートのユーザ名とパスワードを入力してください。Kerberos 認証を使用する場合は、有効な Kerberos チケットを持っていることを確認してください。"
+msgstr "このページにアクセスするために、あなたのユーザー名とパスワード、あるいは root のユーザー名とパスワードを入力してください。Kerberos 認証を使用している場合、有効な Kerberos チケットがあることを確認してください。"
+
+#: ppdc/sample.c:241
msgid "Envelope Feed"
-msgstr "封筒配信"
+msgstr "封筒フィード"
+
+#: ppdc/sample.c:212
msgid "Epson"
msgstr "Epson"
+
+#: cgi-bin/admin.c:3576
msgid "Error Policy"
msgstr "エラーポリシー"
+
+#: systemv/lpinfo.c:109 systemv/lpmove.c:94
msgid "Error: need hostname after '-h' option!\n"
-msgstr "エラー:‘-h’オプションの後にホスト名が必要です!\n"
+msgstr "Error: '-h' オプションのあとにはホスト名が必要です!\n"
+
+#: ppdc/sample.c:327
msgid "Every 10 Labels"
msgstr "10 ラベルごと"
+
+#: ppdc/sample.c:319
msgid "Every 2 Labels"
msgstr "2 ラベルごと"
+
+#: ppdc/sample.c:320
msgid "Every 3 Labels"
msgstr "3 ラベルごと"
+
+#: ppdc/sample.c:321
msgid "Every 4 Labels"
msgstr "4 ラベルごと"
+
+#: ppdc/sample.c:322
msgid "Every 5 Labels"
msgstr "5 ラベルごと"
+
+#: ppdc/sample.c:323
msgid "Every 6 Labels"
msgstr "6 ラベルごと"
+
+#: ppdc/sample.c:324
msgid "Every 7 Labels"
msgstr "7 ラベルごと"
+
+#: ppdc/sample.c:325
msgid "Every 8 Labels"
msgstr "8 ラベルごと"
+
+#: ppdc/sample.c:326
msgid "Every 9 Labels"
msgstr "9 ラベルごと"
+
+#: ppdc/sample.c:318
msgid "Every Label"
-msgstr "1 ラベルごと"
+msgstr "すべてのラベル"
+
+#: cups/http-support.c:1236
msgid "Expectation Failed"
-msgstr "Expect リクエストに失敗しました"
+msgstr "Expectation Failed"
+
+#: cgi-bin/admin.c:2319 cgi-bin/admin.c:2338
msgid "Export Printers to Samba"
-msgstr "プリンタを Samba に書き出す"
+msgstr "Samba へプリンターをエクスポート"
+
+#: systemv/cupstestdsc.c:176 systemv/cupstestdsc.c:193
+#: systemv/cupstestdsc.c:218 systemv/cupstestdsc.c:235
+#: systemv/cupstestdsc.c:259 systemv/cupstestdsc.c:277
+#: systemv/cupstestdsc.c:306 systemv/cupstestdsc.c:343
+#: systemv/cupstestdsc.c:353 systemv/cupstestdsc.c:363
+#: systemv/cupstestdsc.c:373 systemv/cupstestdsc.c:383
+#: systemv/cupstestdsc.c:391
msgid "FAIL\n"
msgstr "失敗\n"
+
+#: ppdc/sample.c:132
msgid "File Folder"
-msgstr "ファイルフォルダ"
+msgstr "ファイルフォルダー"
+
+#: ppdc/sample.c:141
msgid "File Folder - 9/16 x 3 7/16\""
-msgstr "ファイルフォルダ - 9/16 x 3 7/16\""
+msgstr "ファイルフォルダー - 9/16 x 3 7/16\""
+
+#: scheduler/ipp.c:2516
+#, c-format
msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
-msgstr "ファイルデバイス URI が無効になっています!有効にするには、“%s/cupsd.conf”の FileDevice ディレクティブを参照してください。"
+msgstr "ファイルデバイス URI は無効になっています! 有効にするには、\"%s/cupsd.conf\" の FileDevice ディレクティブを参照してください。"
+
+#: ppdc/sample.c:92
msgid "Folio"
-msgstr "Folio"
+msgstr "フォリオ"
+
+#: cups/http-support.c:1215
msgid "Forbidden"
-msgstr "アクセス権がありません"
+msgstr "Forbidden"
+
+#: backend/ipp.c:1694
msgid "Fuser temperature high!"
-msgstr "定着器の温度が高くなっています!"
+msgstr "定着器の温度が上っています!"
+
+#: backend/ipp.c:1696
msgid "Fuser temperature low!"
-msgstr "定着器の温度が低くなっています!"
+msgstr "定着器の温度が下っています!"
+
+#: cups/ppd.c:697 cups/ppd.c:1226
msgid "General"
msgstr "一般"
+
+#: ppdc/sample.c:231
msgid "Generic"
msgstr "汎用"
+
+#: ppdc/sample.c:89
msgid "German FanFold"
msgstr "German FanFold"
+
+#: ppdc/sample.c:90
msgid "German FanFold Legal"
-msgstr "German FanFold リーガル"
+msgstr "German FanFold Legal"
+
+#: cups/snmp.c:1015
msgid "Get-Response-PDU uses indefinite length"
-msgstr "Get-Response-PDU に使われている長さが不定です"
+msgstr "Get-Response-PDU は不確定の長さを使用しています"
+
+#: ppdc/sample.c:262
msgid "Glossy Paper"
msgstr "光沢紙"
+
+#: scheduler/ipp.c:3634 scheduler/ipp.c:3937 scheduler/ipp.c:6599
+#: scheduler/ipp.c:6741 scheduler/ipp.c:8011 scheduler/ipp.c:9135
+#: scheduler/ipp.c:9360 scheduler/ipp.c:9777 scheduler/ipp.c:10352
msgid "Got a printer-uri attribute but no job-id!"
-msgstr "printer-uri 属性を取得しましたが、job-id がありません!"
+msgstr "printer-uri 属性を取得しましたが、job-id を取得できませんでした!"
+
+#: ppdc/sample.c:227
msgid "Grayscale"
-msgstr "グレイスケール"
+msgstr "グレースケール"
+
+#: ppdc/sample.c:251
msgid "HP"
msgstr "HP"
+
+#: ppdc/sample.c:133
msgid "Hanging Folder"
-msgstr "ハンギングフォルダ"
+msgstr "Hanging Folder"
+
+#: ppdc/sample.c:142
msgid "Hanging Folder - 9/16 x 2\""
-msgstr "ハンギングフォルダ - 9/16 x 2\""
+msgstr "Hanging Folder - 9/16 x 2\""
+
+#: backend/pap.c:296
msgid "INFO: AppleTalk disabled in System Preferences\n"
-msgstr "INFO: AppleTalk は“システム環境設定”で無効になっています\n"
+msgstr "INFO: AppleTalk がシステムプレファレンスで無効にされています\n"
+
+#: backend/pap.c:511
msgid "INFO: AppleTalk disabled in System Preferences.\n"
-msgstr "INFO: AppleTalk は“システム環境設定”で無効になっています。\n"
+msgstr "INFO: AppleTalk がシステムプレファレンスで無効にされています。\n"
+
+#: backend/ipp.c:1334
msgid "INFO: Canceling print job...\n"
-msgstr "INFO: プリントジョブをキャンセル中...\n"
+msgstr "INFO: プリントジョブをキャンセルしています...\n"
+
+#: backend/ipp.c:619 backend/lpd.c:869 backend/socket.c:356
msgid "INFO: Connected to printer...\n"
-msgstr "INFO: プリンタに接続されました...\n"
+msgstr "INFO: プリンターに接続しました...\n"
+
+#: backend/ipp.c:534 backend/lpd.c:702 backend/socket.c:273
msgid "INFO: Connecting to printer...\n"
-msgstr "INFO: プリンタに接続中...\n"
+msgstr "INFO: プリンターに接続中...\n"
+
+#: backend/lpd.c:1028 backend/lpd.c:1175
msgid "INFO: Control file sent successfully\n"
-msgstr "INFO: 制御ファイルの送信に成功しました\n"
+msgstr "INFO: コントロールファイルが正常に送信されました\n"
+
+#: backend/lpd.c:1123
msgid "INFO: Data file sent successfully\n"
-msgstr "INFO: データファイルの送信に成功しました\n"
+msgstr "INFO: データファイルが正常に送信されました\n"
+
+#: filter/imagetoraster.c:1142
+#, c-format
msgid "INFO: Formatting page %d...\n"
-msgstr "INFO: %d ページをフォーマット中...\n"
+msgstr "INFO: ページ %d をフォーマット中...\n"
+
+#: filter/imagetoraster.c:623
msgid "INFO: Loading image file...\n"
-msgstr "INFO: イメージファイルを読み込み中...\n"
+msgstr "INFO: イメージファイルをロード中...\n"
+
+#: cups/http-support.c:1400
msgid "INFO: Looking for printer...\n"
-msgstr "INFO: プリンタを検索中...\n"
+msgstr "INFO: プリンターを探しています...\n"
+
+#: backend/pap.c:928
msgid "INFO: Opening connection\n"
-msgstr "INFO: 接続を開いています\n"
+msgstr "INFO: コネクションを開いています\n"
+
+#: backend/socket.c:427
msgid "INFO: Print file sent, waiting for printer to finish...\n"
-msgstr "INFO: プリントファイルが送信されました、プリンタの終了を待機中...\n"
+msgstr "INFO: プリントファイルを送信し、プリンターが作業を完了するのを待っています...\n"
+
+#: backend/ipp.c:1027 backend/usb-unix.c:132
msgid "INFO: Printer busy; will retry in 10 seconds...\n"
-msgstr "INFO: プリンタでの処理が混み合っています。10 秒後に再試行します...\n"
+msgstr "INFO: プリンターがビジー状態です。10 秒後に再試行します...\n"
+
+#: backend/parallel.c:236 backend/scsi-irix.c:147 backend/scsi-linux.c:161
+#: backend/serial.c:256
msgid "INFO: Printer busy; will retry in 30 seconds...\n"
-msgstr "INFO: プリンタでの処理が混み合っています。30 秒後に再試行します...\n"
+msgstr "INFO: プリンターがビジー状態です。30 秒後に再試行します...\n"
+
+#: backend/usb-unix.c:437
msgid "INFO: Printer busy; will retry in 5 seconds...\n"
-msgstr "INFO: プリンタでの処理が混み合っています。5 秒後に再試行します...\n"
+msgstr "INFO: プリンターがビジー状態です。5 秒後に再試行します...\n"
+
+#: backend/ipp.c:728 backend/ipp.c:1038
+#, c-format
msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n"
-msgstr "INFO: プリンタは IPP/%d.%d に対応していません。IPP/1.0 を試行中...\n"
+msgstr "INFO: プリンターが IPP/%d.%d をサポートしていません。IPP/1.0 を試します...\n"
+
+#: backend/usb-unix.c:521
msgid "INFO: Printer is busy; will retry in 5 seconds...\n"
-msgstr "INFO: プリンタでの処理が混み合っています。5 秒後に再試行します...\n"
+msgstr "INFO: プリンターがビジー状態です。5 秒後に再試行します...\n"
+
+#: backend/runloop.c:357
msgid "INFO: Printer is currently off-line.\n"
-msgstr "INFO: プリンタは現在オフラインです。\n"
+msgstr "INFO: プリンターは現在オフラインです。\n"
+
+#: backend/runloop.c:243
msgid "INFO: Printer is currently offline.\n"
-msgstr "INFO: プリンタは現在オフラインです。\n"
+msgstr "INFO: プリンターは現在オフラインです。\n"
+
+#: backend/runloop.c:379 backend/usb-darwin.c:1144
msgid "INFO: Printer is now online.\n"
-msgstr "INFO: プリンタがオンラインになりました。\n"
+msgstr "INFO: プリンターは現在オンラインです。\n"
+
+#: backend/usb-darwin.c:1162
msgid "INFO: Printer is offline.\n"
-msgstr "INFO: プリンタはオフラインです。\n"
+msgstr "INFO: プリンターはオフラインです。\n"
+
+#: backend/parallel.c:242 backend/usb-unix.c:139
msgid "INFO: Printer not connected; will retry in 30 seconds...\n"
-msgstr "INFO: プリンタが接続されていません。30 秒後に再試行します...\n"
+msgstr "INFO: プリンターに接続できません。30 秒後に再試行します...\n"
+
+#: filter/rastertoepson.c:1076 filter/rastertohp.c:801
+#: filter/rastertolabel.c:1232
+#, c-format
msgid "INFO: Printing page %d, %d%% complete...\n"
-msgstr "INFO: %d ページをプリント中。%d%% が完了しました...\n"
+msgstr "INFO: ページ %d をプリント中、%d%% 完了しました...\n"
+
+#: filter/imagetops.c:808
+#, c-format
msgid "INFO: Printing page %d...\n"
-msgstr "INFO: %d ページをプリント中...\n"
+msgstr "INFO: ページ %d をプリント中...\n"
+
+#: backend/socket.c:459 filter/rastertoepson.c:1126 filter/rastertohp.c:856
+#: filter/rastertolabel.c:1281
msgid "INFO: Ready to print.\n"
-msgstr "INFO: プリントの準備が整いました。\n"
+msgstr "INFO: プリントの準備ができています\n"
+
+#: backend/lpd.c:1147
+#, c-format
msgid "INFO: Sending control file (%lu bytes)\n"
-msgstr "INFO: 制御ファイル(%lu バイト)を送信中\n"
+msgstr "INFO: コントロールファイルを送信中 (%lu バイト)\n"
+
+#: backend/lpd.c:1000
+#, c-format
msgid "INFO: Sending control file (%u bytes)\n"
-msgstr "INFO: 制御ファイル(%u バイト)を送信中\n"
+msgstr "INFO: コントロールファイルを送信中 (%u バイト)\n"
+
+#: backend/pap.c:564
msgid "INFO: Sending data\n"
msgstr "INFO: データを送信中\n"
+
+#: backend/lpd.c:1059
+#, c-format
msgid "INFO: Sending data file (%ld bytes)\n"
-msgstr "INFO: データファイル(%ld バイト)を送信中\n"
+msgstr "INFO: データファイルを送信中 (%ld バイト)\n"
+
+#: backend/lpd.c:1057
+#, c-format
msgid "INFO: Sending data file (%lld bytes)\n"
-msgstr "INFO: データファイル(%lld バイト)を送信中\n"
+msgstr "INFO: データファイルを送信中 (%lld バイト)\n"
+
+#: backend/usb-darwin.c:521
msgid "INFO: Sending print data...\n"
msgstr "INFO: プリントデータを送信中...\n"
+
+#: backend/parallel.c:294 backend/socket.c:406 backend/usb-unix.c:201
+#, c-format
msgid "INFO: Sent print file, %ld bytes...\n"
-msgstr "INFO: プリントファイル %ld バイトが送信されました...\n"
+msgstr "INFO: プリントファイルを送信、%ld バイト...\n"
+
+#: backend/parallel.c:292 backend/socket.c:404 backend/usb-unix.c:199
+#, c-format
msgid "INFO: Sent print file, %lld bytes...\n"
-msgstr "INFO: プリントファイル %lld バイトが送信されました...\n"
+msgstr "INFO: プリントファイルを送信、%lld バイト...\n"
+
+#: backend/lpd.c:1071
+#, c-format
msgid "INFO: Spooling LPR job, %.0f%% complete...\n"
-msgstr "INFO: LPR ジョブをスプール中、%.0f%% が完了しました...\n"
+msgstr "INFO: LPR ジョブをスプール中、%.0f%% 完了しました...\n"
+
+#: backend/ipp.c:551 backend/ipp.c:809 backend/lpd.c:802
+#: backend/parallel.c:221 backend/scsi-irix.c:125 backend/scsi-linux.c:139
+#: backend/serial.c:241 backend/socket.c:294 backend/usb-unix.c:117
msgid "INFO: Unable to contact printer, queuing on next printer in class...\n"
-msgstr "INFO: プリンタに接続できません。クラス内の次のプリンタのキューに入ります...\n"
+msgstr "INFO: プリンターと交信できません。クラス内の次のプリンターにキューします...\n"
+
+#: backend/pap.c:309
+#, c-format
msgid "INFO: Using default AppleTalk zone \"%s\"\n"
-msgstr "INFO: デフォルトの AppleTalk ゾーン“%s”を使用中\n"
+msgstr "INFO: デフォルトの AppleTalk ゾーン \"%s\" を使います\n"
+
+#: backend/ipp.c:1132
msgid "INFO: Waiting for job to complete...\n"
-msgstr "INFO: ジョブの完了を待機中...\n"
+msgstr "INFO: ジョブが完了するのを待っています...\n"
+
+#: backend/usb-darwin.c:441 backend/usb-libusb.c:117
msgid "INFO: Waiting for printer to become available...\n"
-msgstr "INFO: プリンタが利用可能になるのを待機中...\n"
+msgstr "INFO: プリンターが使用可能になるのを待っています...\n"
+
+#: ppdc/sample.c:93
msgid "ISO B0"
msgstr "ISO B0"
+
+#: ppdc/sample.c:94
msgid "ISO B1"
msgstr "ISO B1"
+
+#: ppdc/sample.c:104
msgid "ISO B10"
msgstr "ISO B10"
+
+#: ppdc/sample.c:95
msgid "ISO B2"
msgstr "ISO B2"
+
+#: ppdc/sample.c:96
msgid "ISO B3"
msgstr "ISO B3"
+
+#: ppdc/sample.c:97
msgid "ISO B4"
msgstr "ISO B4"
+
+#: ppdc/sample.c:69
msgid "ISO B4 Envelope"
msgstr "ISO B4 封筒"
+
+#: ppdc/sample.c:98
msgid "ISO B5"
msgstr "ISO B5"
+
+#: ppdc/sample.c:99
msgid "ISO B5 (Oversize)"
-msgstr "ISO B5(特大)"
+msgstr "ISO B5 (特大)"
+
+#: ppdc/sample.c:70
msgid "ISO B5 Envelope"
msgstr "ISO B5 封筒"
+
+#: ppdc/sample.c:100
msgid "ISO B6"
msgstr "ISO B6"
+
+#: ppdc/sample.c:71
msgid "ISO B6 Envelope"
msgstr "ISO B6 封筒"
+
+#: ppdc/sample.c:101
msgid "ISO B7"
msgstr "ISO B7"
+
+#: ppdc/sample.c:102
msgid "ISO B8"
msgstr "ISO B8"
+
+#: ppdc/sample.c:103
msgid "ISO B9"
msgstr "ISO B9"
+
+#: cups/ppd.c:349
msgid "Illegal control character"
-msgstr "制御文字が不正です"
+msgstr "不正な制御文字"
+
+#: cups/ppd.c:350
msgid "Illegal main keyword string"
-msgstr "メインキーワード文字列が不正です"
+msgstr "不正なメインキーワード文字列"
+
+#: cups/ppd.c:351
msgid "Illegal option keyword string"
-msgstr "オプションキーワード文字列が不正です"
+msgstr "不正なオプションキーワード文字列"
+
+#: cups/ppd.c:352
msgid "Illegal translation string"
-msgstr "変換文字列が不正です"
+msgstr "不正な翻訳文字列"
+
+#: cups/ppd.c:353
msgid "Illegal whitespace character"
-msgstr "空白文字が不正です"
+msgstr "不正な空白文字"
+
+#: backend/ipp.c:1686
msgid "Ink/toner almost empty."
-msgstr "インク/トナーがもうすぐ空になります。"
+msgstr "インクまたはトナーがほとんどありません。"
+
+#: backend/ipp.c:1688
msgid "Ink/toner empty!"
-msgstr "インク/トナーが空です!"
+msgstr "インクまたはトナーがありません!"
+
+#: backend/ipp.c:1690
msgid "Ink/toner waste bin almost full."
-msgstr "廃インクまたは廃トナーボックスがほとんど一杯です。"
+msgstr "廃インクまたは廃トナー容器がほとんど一杯です。"
+
+#: backend/ipp.c:1692
msgid "Ink/toner waste bin full!"
-msgstr "廃インクまたは廃トナーボックスが一杯です!"
+msgstr "廃インクまたは廃トナー容器が一杯です!"
+
+#: ppdc/sample.c:246
msgid "Installable Options"
-msgstr "インストール可能なオプション"
+msgstr "インストール可能オプション"
+
+#: ppdc/sample.c:249
msgid "Installed"
-msgstr "インストール済み"
+msgstr "インストールされています"
+
+#: ppdc/sample.c:265
msgid "IntelliBar Label Printer"
-msgstr "IntelliBar ラベルプリンタ"
+msgstr "IntelliBar ラベルプリンター"
+
+#: ppdc/sample.c:264
msgid "Intellitech"
msgstr "Intellitech"
+
+#: backend/ipp.c:1670
msgid "Interlock open."
msgstr "インターロックが開いています。"
+
+#: cups/ppd.c:340
msgid "Internal error"
msgstr "内部エラー"
+
+#: ppdc/sample.c:130
msgid "Internet Postage 2-Part"
msgstr "Internet Postage 2-Part"
+
+#: ppdc/sample.c:139
msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\""
msgstr "Internet Postage 2-Part - 2 1/4 x 7 1/2\""
+
+#: ppdc/sample.c:131
msgid "Internet Postage 3-Part"
msgstr "Internet Postage 3-Part"
+
+#: ppdc/sample.c:140
msgid "Internet Postage 3-Part - 2 1/4 x 7\""
msgstr "Internet Postage 3-Part - 2 1/4 x 7\""
+
+#: backend/ipp.c:204
msgid "Internet Printing Protocol"
-msgstr "IPP(Internet Printing Protocol)"
+msgstr "インターネット印刷プロトコル"
+
+#: ppdc/sample.c:68
msgid "Invite Envelope"
msgstr "招待状封筒"
+
+#: ppdc/sample.c:72
msgid "Italian Envelope"
-msgstr "イタリア標準封筒"
+msgstr "イタリア封筒"
+
+#: cups/ppd.c:1344
msgid "JCL"
msgstr "JCL"
+
+#: scheduler/ipp.c:9433
+#, c-format
msgid "Job #%d cannot be restarted - no files!"
-msgstr "ジョブ #%d を再開できません - ファイルがありません!"
+msgstr "ジョブ番号 %d を再開できません - ファイルが見つかりません!"
+
+#: scheduler/ipp.c:3675 scheduler/ipp.c:4045 scheduler/ipp.c:6640
+#: scheduler/ipp.c:6782 scheduler/ipp.c:7888 scheduler/ipp.c:8052
+#: scheduler/ipp.c:8288 scheduler/ipp.c:8333 scheduler/ipp.c:9176
+#: scheduler/ipp.c:9401 scheduler/ipp.c:9818 scheduler/ipp.c:10393
+#, c-format
msgid "Job #%d does not exist!"
-msgstr "ジョブ #%d が存在しません!"
+msgstr "ジョブ番号 %d は存在しません!"
+
+#: scheduler/ipp.c:4076
+#, c-format
msgid "Job #%d is already aborted - can't cancel."
-msgstr "ジョブ #%d はすでに破棄されています - キャンセルできません。"
+msgstr "ジョブ番号 %d はすでに中断されています - キャンセルできません。"
+
+#: scheduler/ipp.c:4070
+#, c-format
msgid "Job #%d is already canceled - can't cancel."
-msgstr "ジョブ #%d はすでにキャンセルされています - キャンセルできません。"
+msgstr "ジョブ番号 %d はすでにキャンセルされています - キャンセルできません。"
+
+#: scheduler/ipp.c:4082
+#, c-format
msgid "Job #%d is already completed - can't cancel."
-msgstr "ジョブ #%d はすでに完了しています - キャンセルできません。"
+msgstr "ジョブ番号 %d はすでに完了しています - キャンセルできません。"
+
+#: scheduler/ipp.c:8375 scheduler/ipp.c:10408
+#, c-format
msgid "Job #%d is finished and cannot be altered!"
-msgstr "ジョブ #%d は終了しているため変更できません!"
+msgstr "ジョブ番号 %d はすでに終了し、変更できません!"
+
+#: scheduler/ipp.c:9415
+#, c-format
msgid "Job #%d is not complete!"
-msgstr "ジョブ #%d は完了していません!"
+msgstr "ジョブ番号 %d は完了していません!"
+
+#: scheduler/ipp.c:3690
+#, c-format
msgid "Job #%d is not held for authentication!"
-msgstr "ジョブ #%d は認証のために保留中ではありません!"
+msgstr "ジョブ番号 %d は認証のために保留されていません!"
+
+#: scheduler/ipp.c:9190
+#, c-format
msgid "Job #%d is not held!"
-msgstr "ジョブ #%d は保留中ではありません!"
+msgstr "ジョブ番号 %d は保留されていません!"
+
+#: scheduler/ipp.c:7866
+#, c-format
msgid "Job #%s does not exist!"
-msgstr "ジョブ #%s が存在しません!"
+msgstr "ジョブ番号 #%s は存在しません!"
+
+#: scheduler/ipp.c:6267
+#, c-format
msgid "Job %d not found!"
-msgstr "ジョブ %d が見つかりません!"
+msgstr "ジョブ番号 %d は見つかりません!"
+
+#: cgi-bin/ipp-var.c:1031
msgid "Job Completed"
-msgstr "ジョブが完了しました"
+msgstr "ジョブ完了"
+
+#: cgi-bin/ipp-var.c:1029
msgid "Job Created"
-msgstr "ジョブが作成されました"
+msgstr "ジョブ作成"
+
+#: filter/bannertops.c:619
msgid "Job ID: "
-msgstr "ジョブ ID:"
+msgstr "ジョブ ID: "
+
+#: cgi-bin/ipp-var.c:1035
msgid "Job Options Changed"
-msgstr "ジョブのオプションが変更されました"
+msgstr "ジョブオプション変更"
+
+#: cgi-bin/ipp-var.c:1033
msgid "Job Stopped"
-msgstr "ジョブが停止されました"
+msgstr "ジョブ中止"
+
+#: filter/bannertops.c:627
msgid "Job UUID: "
-msgstr "ジョブ UUID:"
+msgstr "ジョブ UUID: "
+
+#: scheduler/ipp.c:10490
msgid "Job is completed and cannot be changed."
-msgstr "ジョブは完了しているため変更できません。"
+msgstr "ジョブは完了し変更できません。"
+
+#: cgi-bin/jobs.c:197
msgid "Job operation failed:"
-msgstr "ジョブの操作に失敗しました:"
+msgstr "ジョブ操作失敗:"
+
+#: scheduler/ipp.c:10526 scheduler/ipp.c:10547 scheduler/ipp.c:10558
msgid "Job state cannot be changed."
-msgstr "ジョブの状況を変更できません。"
+msgstr "ジョブの状態を変更できません。"
+
+#: scheduler/ipp.c:9280
msgid "Job subscriptions cannot be renewed!"
-msgstr "ジョブ照会先を更新できません!"
+msgstr "ジョブサブスクリプションが更新できません!"
+
+#: cgi-bin/jobs.c:102 cgi-bin/jobs.c:113 cgi-bin/jobs.c:194
msgid "Jobs"
msgstr "ジョブ"
+
+#: ppdc/sample.c:73
msgid "Kaku2 Envelope"
msgstr "角 2 封筒"
+
+#: ppdc/sample.c:74
msgid "Kaku3 Envelope"
msgstr "角 3 封筒"
+
+#: backend/lpd.c:178
msgid "LPD/LPR Host or Printer"
-msgstr "LPD/LPR ホストまたはプリンタ"
+msgstr "LPD/LPR ホストまたはプリンター"
+
+#: ppdc/sample.c:202
msgid "Label Printer"
-msgstr "ラベルプリンタ"
+msgstr "ラベルプリンター"
+
+#: ppdc/sample.c:418
msgid "Label Top"
-msgstr "ラベル上部"
+msgstr "ラベルトップ"
+
+#: scheduler/ipp.c:2138 scheduler/ipp.c:6190
+#, c-format
msgid "Language \"%s\" not supported!"
-msgstr "言語“%s”には対応していません!"
+msgstr "言語 \"%s\" はサポートされていません!"
+
+#: ppdc/sample.c:127
msgid "Large Address"
-msgstr "住所(大)"
+msgstr "ラージアドレス"
+
+#: ppdc/sample.c:136
msgid "Large Address - 1 4/10 x 3 1/2\""
-msgstr "住所(大) - 1 4/10 x 3 1/2\""
+msgstr "ラージアドレス - 1 4/10 x 3 1/2\""
+
+#: ppdc/sample.c:263
msgid "LaserJet Series PCL 4/5"
-msgstr "LaserJet シリーズ PCL 4/5"
+msgstr "LaserJet Series PCL 4/5"
+
+#: ppdc/sample.c:208
msgid "Light"
msgstr "薄い"
+
+#: cups/ppd.c:348
msgid "Line longer than the maximum allowed (255 characters)"
-msgstr "行が最大許容文字数(255 文字)を超えています"
+msgstr "1 行が最大値 (255 文字) を超えています"
+
+#: cgi-bin/admin.c:2356
msgid "List Available Printers"
-msgstr "使用可能なプリンタをリスト表示"
+msgstr "使用可能なプリンターをリスト化"
+
+#: filter/bannertops.c:740
msgid "Location: "
-msgstr "場所:"
+msgstr "場所: "
+
+#: ppdc/sample.c:244
msgid "Long-Edge (Portrait)"
-msgstr "長辺(縦)"
+msgstr "長辺給紙 (縦向き)"
+
+#: filter/bannertops.c:749
msgid "Make and Model: "
-msgstr "製造元と機種:"
+msgstr "プリンタードライバー: "
+
+#: ppdc/sample.c:240
msgid "Manual Feed"
msgstr "手差し"
+
+#: filter/bannertops.c:776
msgid "Media Dimensions: "
-msgstr "メディアの大きさ:"
+msgstr "用紙の大きさ: "
+
+#: filter/bannertops.c:796
msgid "Media Limits: "
-msgstr "メディアの制限:"
+msgstr "用紙の印字領域: "
+
+#: filter/bannertops.c:765
msgid "Media Name: "
-msgstr "メディアの名前:"
+msgstr "用紙名:"
+
+#: cups/ppd.c:744 cups/ppd.c:1281
msgid "Media Size"
-msgstr "メディアサイズ"
+msgstr "用紙サイズ"
+
+#: cups/ppd.c:748 cups/ppd.c:1285 ppdc/sample.c:234
msgid "Media Source"
-msgstr "メディアソース"
+msgstr "給紙"
+
+#: ppdc/sample.c:336
msgid "Media Tracking"
-msgstr "メディアトラッキング"
+msgstr "用紙の経路"
+
+#: cups/ppd.c:746 cups/ppd.c:1283 ppdc/sample.c:257
msgid "Media Type"
-msgstr "メディアタイプ"
+msgstr "用紙種類"
+
+#: backend/ipp.c:1657
msgid "Media jam!"
-msgstr "メディアが詰まっています!"
+msgstr "紙詰まりです!"
+
+#: backend/ipp.c:1676
msgid "Media tray almost empty."
-msgstr "メディアトレイがもうすぐ空になります。"
+msgstr "用紙トレイが空になりかけています。"
+
+#: backend/ipp.c:1678
msgid "Media tray empty!"
-msgstr "メディアトレイが空です!"
+msgstr "用紙トレイが空になりました!"
+
+#: backend/ipp.c:1674
msgid "Media tray missing!"
-msgstr "メディアトレイがありません!"
+msgstr "用紙トレイが見つかりません!"
+
+#: backend/ipp.c:1655
msgid "Media tray needs to be filled."
-msgstr "メディアトレイに補充が必要です。"
+msgstr "用紙トレイに補充が必要です。"
+
+#: ppdc/sample.c:209
msgid "Medium"
-msgstr "中"
+msgstr "紙質"
+
+#: cups/ppd.c:337
msgid "Memory allocation error"
-msgstr "メモリの割り当てエラー"
+msgstr "メモリ割り当てエラー"
+
+#: cups/ppd.c:338
msgid "Missing PPD-Adobe-4.x header"
msgstr "PPD-Adobe-4.x ヘッダがありません"
+
+#: cups/ppd.c:347
msgid "Missing asterisk in column 1"
msgstr "1 列目にアスタリスクがありません"
+
+#: scheduler/ipp.c:6662
msgid "Missing document-number attribute!"
-msgstr "document-number 属性がありません!"
+msgstr "document-number 属性がありません!"
+
+#: cups/adminutil.c:284
+#, c-format
msgid "Missing double quote on line %d!"
-msgstr "%d 行目に二重引用符がありません!"
+msgstr "%d 行に二重引用符がありません!"
+
+#: cgi-bin/admin.c:2068 cgi-bin/admin.c:2153 cgi-bin/admin.c:2789
+#: cgi-bin/admin.c:3043 cgi-bin/admin.c:3154 cgi-bin/admin.c:3832
msgid "Missing form variable!"
-msgstr "フォーム変数がありません!"
+msgstr "form 変数がありません!"
+
+#: scheduler/ipp.c:7062
msgid "Missing notify-subscription-ids attribute!"
-msgstr "notify-subscription-ids 属性がありません!"
+msgstr "notify-subscription-ids 属性がありません!"
+
+#: scheduler/ipp.c:3812
msgid "Missing requesting-user-name attribute!"
-msgstr "requesting-user-name 属性がありません!"
+msgstr "requesting-user-name 属性が設定されていません!"
+
+#: scheduler/ipp.c:465
msgid "Missing required attributes!"
-msgstr "必要な属性がありません!"
+msgstr "必須の属性が設定されていません!"
+
+#: cups/adminutil.c:265
+#, c-format
msgid "Missing value on line %d!"
-msgstr "%d 行目に値がありません!"
+msgstr "%d 行に値がありません!"
+
+#: cups/ppd.c:339
msgid "Missing value string"
msgstr "値文字列がありません"
-msgid "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n"
-msgstr "機種:name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n"
+
+#: systemv/lpinfo.c:475
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+msgstr ""
+"モデル: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+
+#: cgi-bin/admin.c:480
msgid "Modify Class"
-msgstr "クラスを変更"
+msgstr "クラスの変更"
+
+#: cgi-bin/admin.c:772
msgid "Modify Printer"
-msgstr "プリンタを変更"
+msgstr "プリンターの変更"
+
+#: ppdc/sample.c:111
msgid "Monarch"
msgstr "Monarch"
+
+#: ppdc/sample.c:75
msgid "Monarch Envelope"
msgstr "Monarch 封筒"
+
+#: cgi-bin/ipp-var.c:416 cgi-bin/ipp-var.c:493
msgid "Move All Jobs"
-msgstr "すべてのジョブを移動"
+msgstr "すべてのジョブの移動"
+
+#: cgi-bin/ipp-var.c:361 cgi-bin/ipp-var.c:414 cgi-bin/ipp-var.c:491
msgid "Move Job"
-msgstr "ジョブを移動"
+msgstr "ジョブの移動"
+
+#: cups/http-support.c:1200
msgid "Moved Permanently"
-msgstr "完全に移動されました"
+msgstr "別の場所へ移動しました"
+
+#: backend/ipp.c:1057
+#, c-format
msgid "NOTICE: Print file accepted - job ID %d.\n"
-msgstr "NOTICE: プリントファイルは受け入れ済みです - ジョブ ID %d。\n"
+msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID %d。\n"
+
+#: backend/ipp.c:1051
msgid "NOTICE: Print file accepted - job ID unknown.\n"
-msgstr "NOTICE: プリントファイルは受け入れ済みです - ジョブ ID 不明。\n"
+msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID 不明。\n"
+
+#: cups/ppd.c:336
msgid "NULL PPD file pointer"
-msgstr "NULL PPD ファイルポインタ"
+msgstr "PPD ファイルポインターが NULL です"
+
+#: cups/snmp.c:1052
msgid "Name OID uses indefinite length"
-msgstr "名前 OID に使われている長さが不定です"
+msgstr "OID 名は限定的な長さを使用します"
+
+#: ppdc/sample.c:402
msgid "Never"
-msgstr "しない"
+msgstr "Never"
+
+#: ppdc/sample.c:228
msgid "New Stylus Color Series"
-msgstr "新しい Stylus Color シリーズ"
+msgstr "New Stylus Color シリーズ"
+
+#: ppdc/sample.c:230
msgid "New Stylus Photo Series"
-msgstr "新しい Stylus Photo シリーズ"
+msgstr "New Stylus Photo シリーズ"
+
+#: cups/ppd.c:1867
msgid "No"
msgstr "いいえ"
+
+#: cups/http-support.c:1197
msgid "No Content"
-msgstr "内容がありません"
+msgstr "中身がありません"
+
+#: cups/util.c:1308
msgid "No PPD name!"
-msgstr "PPD 名がありません!"
+msgstr "PPD の名前がありません!"
+
+#: cups/snmp.c:1046
msgid "No VarBind SEQUENCE"
msgstr "VarBind SEQUENCE がありません"
+
+#: cups/adminutil.c:799
msgid "No Windows printer drivers are installed!"
-msgstr "Windows プリンタドライバがインストールされていません!"
+msgstr "Windows プリンタードライバーがインストールされていません!"
+
+#: cups/request.c:504 cups/request.c:763
msgid "No active connection"
-msgstr "アクティブな接続がありません"
+msgstr "アクティブな接続はありません"
+
+#: scheduler/ipp.c:3992
+#, c-format
msgid "No active jobs on %s!"
-msgstr "%s にアクティブなジョブがありません!"
+msgstr "%s にはアクティブなジョブはありません!"
+
+#: scheduler/ipp.c:308
msgid "No attributes in request!"
-msgstr "要求に属性が含まれていません!"
+msgstr "リクエストに属性がありません!"
+
+#: scheduler/ipp.c:3718
msgid "No authentication information provided!"
-msgstr "認証情報が提供されていません!"
+msgstr "認証情報が提供されていません!"
+
+#: cups/snmp.c:1003
msgid "No community name"
msgstr "コミュニティ名がありません"
+
+#: scheduler/ipp.c:6462
msgid "No default printer"
-msgstr "デフォルトプリンタがありません"
+msgstr "デフォルトのプリンターはありません"
+
+#: scheduler/ipp.c:7637
msgid "No destinations added."
-msgstr "送信先は追加されませんでした。"
+msgstr "追加された宛先はありません"
+
+#: cups/snmp.c:1033
msgid "No error-index"
-msgstr "error-index がありません"
+msgstr "エラーインデックスがありません"
+
+#: cups/snmp.c:1025
msgid "No error-status"
-msgstr "error-status がありません"
+msgstr "エラーステータスがありません"
+
+#: scheduler/ipp.c:8574 scheduler/ipp.c:9869
msgid "No file!?!"
-msgstr "ファイルがありません!?!"
+msgstr "ファイルがありません!?!"
+
+#: cups/util.c:930
msgid "No modification time!"
-msgstr "変更時刻がありません!"
+msgstr "変更時刻がありません!"
+
+#: cups/snmp.c:1050
msgid "No name OID"
-msgstr "名前 OID がありません"
+msgstr "OID 名がありません"
+
+#: cups/util.c:924
msgid "No printer name!"
-msgstr "プリンタ名がありません!"
+msgstr "プリンター名がありません!"
+
+#: cups/util.c:1861
msgid "No printer-uri found for class!"
-msgstr "クラスの printer-uri が見つかりませんでした!"
+msgstr "クラスのプリンターURI が見つかりません!"
+
+#: cups/util.c:1876
msgid "No printer-uri found!"
-msgstr "printer-uri が見つかりませんでした!"
+msgstr "プリンターURI が見つかりません!"
+
+#: scheduler/ipp.c:6847
msgid "No printer-uri in request!"
-msgstr "要求に printer-uri が含まれていません!"
+msgstr "プリンターURI のリクエストがありません!"
+
+#: cups/snmp.c:1017
msgid "No request-id"
-msgstr "request-id がありません"
+msgstr "リクエストID がありません"
+
+#: scheduler/ipp.c:6075
msgid "No subscription attributes in request!"
-msgstr "要求に subscription 属性が含まれていません!"
+msgstr "リクエストにサブスクリプション属性がありません!"
+
+#: scheduler/ipp.c:7951
msgid "No subscriptions found."
-msgstr "照会先が見つかりませんでした。"
+msgstr "サブスクリプションが見つかりません。"
+
+#: cups/snmp.c:1041
msgid "No variable-bindings SEQUENCE"
msgstr "variable-bindings SEQUENCE がありません"
+
+#: cups/snmp.c:996
msgid "No version number"
-msgstr "バージョン番号がありません"
+msgstr "バージョン名がありません"
+
+#: ppdc/sample.c:339
msgid "Non-continuous (Mark sensing)"
-msgstr "非連続(マーク感知)"
+msgstr "非連続です (Mark sensing)"
+
+#: ppdc/sample.c:338
msgid "Non-continuous (Web sensing)"
-msgstr "非連続(Web 感知)"
+msgstr "非連続です (Web sensing)"
+
+#: ppdc/sample.c:210
msgid "Normal"
-msgstr "通常"
+msgstr "標準"
+
+#: cups/http-support.c:1218
msgid "Not Found"
-msgstr "見つかりませんでした"
+msgstr "見つかりません"
+
+#: cups/http-support.c:1230
msgid "Not Implemented"
msgstr "実装されていません"
+
+#: ppdc/sample.c:248
msgid "Not Installed"
msgstr "インストールされていません"
+
+#: cups/http-support.c:1206
msgid "Not Modified"
msgstr "変更されていません"
+
+#: cups/http-support.c:1233
msgid "Not Supported"
-msgstr "対応していません"
+msgstr "サポートされていません"
+
+#: scheduler/ipp.c:1517
msgid "Not allowed to print."
-msgstr "プリントが許可されていません。"
+msgstr "印刷が許可されていません。"
+
+#: ppdc/sample.c:112
msgid "Note"
-msgstr "メモ"
+msgstr "注意"
+
+#: cups/http-support.c:1188 cups/ppd.c:334
msgid "OK"
msgstr "OK"
+
+#: backend/ipp.c:1698
msgid "OPC almost at end-of-life."
-msgstr "OPC がもうすぐ寿命になります。"
+msgstr "OPC はもうすぐ交換が必要になります。"
+
+#: backend/ipp.c:1700
msgid "OPC at end-of-life!"
-msgstr "OPC の寿命が切れました!"
+msgstr "OPC は交換時期です!"
+
+#: ppdc/sample.c:243
msgid "Off (1-Sided)"
-msgstr "オフ(片面)"
+msgstr "Off (片面)"
+
+#: ppdc/sample.c:333
msgid "Oki"
msgstr "Oki"
+
+#: cgi-bin/help.c:89 cgi-bin/help.c:130 cgi-bin/help.c:140 cgi-bin/help.c:171
msgid "Online Help"
msgstr "オンラインヘルプ"
+
+#: cups/adminutil.c:983
+#, c-format
msgid "Open of %s failed: %s"
-msgstr "%s を開けませんでした:%s"
+msgstr "%s のオープンに失敗しました: %s"
+
+#: cups/ppd.c:342
msgid "OpenGroup without a CloseGroup first"
-msgstr "OpenGroup の前に CloseGroup がありません"
+msgstr "OpenGroup の前にまず CloseGroup が必要です"
+
+#: cups/ppd.c:344
msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
-msgstr "OpenUI/JCLOpenUI の前に CloseUI/JCLCloseUI がありません"
+msgstr "OpenUI/JCLOpenUI の前にまず CloseUI/JCLCloseUI が必要です"
+
+#: cgi-bin/admin.c:3603
msgid "Operation Policy"
msgstr "操作ポリシー"
+
+#: cgi-bin/admin.c:3280 cgi-bin/admin.c:3340
msgid "Options Installed"
msgstr "インストールされたオプション"
+
+#: filter/bannertops.c:670
msgid "Options: "
-msgstr "オプション:"
+msgstr "オプション:"
+
+#: backend/ipp.c:1666
msgid "Out of toner!"
-msgstr "トナーが切れています!"
+msgstr "トナー切れです!"
+
+#: cups/ppd.c:750 cups/ppd.c:1287
msgid "Output Mode"
msgstr "出力モード"
+
+#: backend/ipp.c:1682
msgid "Output bin almost full."
msgstr "排紙トレイがほとんど一杯です。"
+
+#: backend/ipp.c:1684
msgid "Output bin full!"
-msgstr "排紙トレイが一杯です!"
+msgstr "排紙トレイが一杯です!"
+
+#: systemv/lpstat.c:1191 systemv/lpstat.c:1195
+#, c-format
msgid "Output for printer %s is sent to %s\n"
-msgstr "プリンタ %s の出力は %s に送信されます\n"
+msgstr "プリンター %s の出力は %s に送られます\n"
+
+#: systemv/lpstat.c:1185
+#, c-format
msgid "Output for printer %s is sent to remote printer %s on %s\n"
-msgstr "プリンタ %1$s の出力は %3$s 上のリモートプリンタ %2$s に送信されます\n"
+msgstr "プリンター %s の出力は、リモートプリンター %s (%s 上) に送られます\n"
+
+#: systemv/lpstat.c:1209 systemv/lpstat.c:1213
+#, c-format
msgid "Output for printer %s/%s is sent to %s\n"
-msgstr "プリンタ %s/%s の出力は %s に送信されます\n"
+msgstr "プリンター %s/%s の出力は %s に送られます\n"
+
+#: systemv/lpstat.c:1203
+#, c-format
msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
-msgstr "プリンタ %1$s/%2$s の出力は %4$s 上のリモートプリンタ %3$s に送信されます\n"
+msgstr "プリンター %s/%s の出力は、リモートプリンター %s (%s 上) に送られます\n"
+
+#: backend/ipp.c:1680
msgid "Output tray missing!"
-msgstr "排紙トレイがありません!"
+msgstr "排紙トレイが見つかりません!"
+
+#: systemv/cupstestdsc.c:403
msgid "PASS\n"
msgstr "合格\n"
+
+#: ppdc/sample.c:232
msgid "PCL Laser Printer"
-msgstr "PCL レーザープリンタ"
+msgstr "PCL レーザープリンター"
+
+#: ppdc/sample.c:77
msgid "PRC1 Envelope"
msgstr "PRC1 封筒"
+
+#: ppdc/sample.c:86
msgid "PRC10 Envelope"
msgstr "PRC10 封筒"
+
+#: ppdc/sample.c:114
msgid "PRC16K"
msgstr "PRC16K"
+
+#: ppdc/sample.c:78
msgid "PRC2 Envelope"
msgstr "PRC2 封筒"
+
+#: ppdc/sample.c:79
msgid "PRC3 Envelope"
msgstr "PRC3 封筒"
+
+#: ppdc/sample.c:115
msgid "PRC32K"
msgstr "PRC32K"
+
+#: ppdc/sample.c:116
msgid "PRC32K (Oversize)"
-msgstr "PRC32K(特大)"
+msgstr "PRC32K (特大)"
+
+#: ppdc/sample.c:80
msgid "PRC4 Envelope"
msgstr "PRC4 封筒"
+
+#: ppdc/sample.c:81
msgid "PRC5 Envelope"
msgstr "PRC5 封筒"
+
+#: ppdc/sample.c:82
msgid "PRC6 Envelope"
msgstr "PRC6 封筒"
+
+#: ppdc/sample.c:83
msgid "PRC7 Envelope"
msgstr "PRC7 封筒"
+
+#: ppdc/sample.c:84
msgid "PRC8 Envelope"
msgstr "PRC8 封筒"
+
+#: ppdc/sample.c:85
msgid "PRC9 Envelope"
msgstr "PRC9 封筒"
+
+#: cups/snmp.c:1013
msgid "Packet does not contain a Get-Response-PDU"
-msgstr "パケットに Get-Response-PDU が含まれていません"
+msgstr "パケットが Get-Response-PDU を含んでいません"
+
+#: cups/snmp.c:992
msgid "Packet does not start with SEQUENCE"
-msgstr "パケットが SEQUENCE で始まっていません"
+msgstr "パケットが SEQUENCE から始まりません"
+
+#: ppdc/sample.c:332
msgid "ParamCustominCutInterval"
msgstr "ParamCustominCutInterval"
+
+#: ppdc/sample.c:330
msgid "ParamCustominTearInterval"
msgstr "ParamCustominTearInterval"
+
+#: cups/auth.c:149
+#, c-format
msgid "Password for %s on %s? "
-msgstr "%2$s 上の %1$s のパスワードを入力してください。"
+msgstr "%s のパスワード (%s 上)? "
+
+#: systemv/cupsaddsmb.c:256
+#, c-format
msgid "Password for %s required to access %s via SAMBA: "
-msgstr "SAMBA 経由で %2$s にアクセスするには %1$s のパスワードが必要です:"
+msgstr "%s のパスワード (SAMBA 経由で %s にアクセスするのに必要):"
+
+#: cgi-bin/classes.c:152
msgid "Pause Class"
-msgstr "クラスを一時停止"
+msgstr "クラスの休止"
+
+#: cgi-bin/printers.c:155
msgid "Pause Printer"
-msgstr "プリンタを一時停止"
+msgstr "プリンターの休止"
+
+#: ppdc/sample.c:420
msgid "Peel-Off"
-msgstr "ガイドに沿って切り取る"
+msgstr "Peel-Off"
+
+#: ppdc/sample.c:76
msgid "Personal Envelope"
-msgstr "個人用封筒"
+msgstr "パーソナル封筒"
+
+#: ppdc/sample.c:123
msgid "Photo"
msgstr "写真"
+
+#: ppdc/sample.c:124
msgid "Photo Labels"
msgstr "写真ラベル"
+
+#: ppdc/sample.c:258
msgid "Plain Paper"
msgstr "普通紙"
+
+#: cgi-bin/admin.c:3298 cgi-bin/admin.c:3552
msgid "Policies"
msgstr "ポリシー"
+
+#: cgi-bin/admin.c:3305 cgi-bin/admin.c:3621 cgi-bin/admin.c:3634
msgid "Port Monitor"
-msgstr "ポートモニタ"
+msgstr "ポートモニター"
+
+#: ppdc/sample.c:250
msgid "PostScript Printer"
-msgstr "PostScript プリンタ"
+msgstr "ポストスクリプトプリンター"
+
+#: ppdc/sample.c:113
msgid "Postcard"
-msgstr "はがき"
+msgstr "ハガキ"
+
+#: ppdc/sample.c:267
msgid "Print Density"
-msgstr "プリント濃度"
+msgstr "印刷密度"
+
+#: cups/notify.c:82
msgid "Print Job:"
-msgstr "プリントジョブ:"
+msgstr "ジョブの印刷:"
+
+#: ppdc/sample.c:312
msgid "Print Mode"
-msgstr "プリントモード"
+msgstr "印刷モード"
+
+#: ppdc/sample.c:355
msgid "Print Rate"
-msgstr "プリントレート"
+msgstr "印刷レート"
+
+#: cgi-bin/printers.c:164
msgid "Print Self-Test Page"
-msgstr "セルフテストページをプリント"
+msgstr "自己テストページの印刷"
+
+#: ppdc/sample.c:299
msgid "Print Speed"
-msgstr "プリント速度"
+msgstr "印刷速度"
+
+#: cgi-bin/ipp-var.c:768
msgid "Print Test Page"
-msgstr "テストページをプリント"
+msgstr "テストページの印刷"
+
+#: ppdc/sample.c:328
msgid "Print and Cut"
-msgstr "プリントしてカット"
+msgstr "Print and Cut"
+
+#: ppdc/sample.c:316
msgid "Print and Tear"
-msgstr "プリントして切り取る"
+msgstr "Print and Tear"
+
+#: filter/bannertops.c:644
msgid "Printed For: "
-msgstr "プリント対象:"
+msgstr "Printed For: "
+
+#: filter/bannertops.c:652
msgid "Printed From: "
-msgstr "プリント元:"
+msgstr "Printed From: "
+
+#: filter/bannertops.c:872
msgid "Printed On: "
-msgstr "プリント先:"
+msgstr "Printed On: "
+
+#: cgi-bin/ipp-var.c:1023
msgid "Printer Added"
-msgstr "プリンタが追加されました"
+msgstr "追加されたプリンター"
+
+#: ppdc/sample.c:235
msgid "Printer Default"
-msgstr "プリンタのデフォルト"
+msgstr "デフォルトのプリンター"
+
+#: cgi-bin/ipp-var.c:1027
msgid "Printer Deleted"
-msgstr "プリンタが削除されました"
+msgstr "削除されたプリンター"
+
+#: cgi-bin/ipp-var.c:1025
msgid "Printer Modified"
-msgstr "プリンタが変更されました"
+msgstr "変更されたプリンター"
+
+#: filter/bannertops.c:610
msgid "Printer Name: "
-msgstr "プリンタ名:"
+msgstr "プリンター名:"
+
+#: cgi-bin/ipp-var.c:1021
msgid "Printer Paused"
-msgstr "プリンタを一時停止中"
+msgstr "プリンターの休止"
+
+#: ppdc/sample.c:266
msgid "Printer Settings"
-msgstr "プリンタ設定"
+msgstr "プリンター設定"
+
+#: backend/ipp.c:1662
msgid "Printer offline."
-msgstr "プリンタはオフラインです。"
+msgstr "プリンターはオフラインです。"
+
+#: cups/notify.c:126
msgid "Printer:"
-msgstr "プリンタ:"
+msgstr "プリンター:"
+
+#: cgi-bin/printers.c:189 cgi-bin/printers.c:317
msgid "Printers"
-msgstr "プリンタ"
+msgstr "プリンター"
+
+#: cgi-bin/classes.c:158 cgi-bin/printers.c:161
msgid "Purge Jobs"
-msgstr "ジョブを消去"
+msgstr "ジョブの削除"
+
+#: ppdc/sample.c:117
msgid "Quarto"
msgstr "Quarto"
+
+#: scheduler/ipp.c:1512
msgid "Quota limit reached."
-msgstr "割り当て容量の制限に達しました。"
+msgstr "Quota の制限に達しました。"
+
+#: berkeley/lpq.c:508
msgid "Rank Owner Job File(s) Total Size\n"
-msgstr "ランク 所有者 ジョブ ファイル 合計サイズ\n"
+msgstr "ランク 所有者 ジョブ ファイル 合計サイズ\n"
+
+#: berkeley/lpq.c:504
msgid "Rank Owner Pri Job Files Total Size\n"
msgstr "ランク 所有者 優先 ジョブ ファイル 合計サイズ\n"
+
+#: cgi-bin/classes.c:156 cgi-bin/printers.c:159
msgid "Reject Jobs"
-msgstr "ジョブを拒否"
+msgstr "ジョブの拒否"
+
+#: ppdc/sample.c:400
msgid "Reprint After Error"
-msgstr "エラー後に再プリント"
+msgstr "エラー後の再印刷"
+
+#: cups/http-support.c:1221
msgid "Request Entity Too Large"
-msgstr "要求エンティティが大きすぎます"
+msgstr "要求するエンティティが大きすぎます"
+
+#: cups/ppd.c:752 cups/ppd.c:1289 ppdc/sample.c:203
msgid "Resolution"
msgstr "解像度"
+
+#: cgi-bin/classes.c:150
msgid "Resume Class"
-msgstr "クラスを再開"
+msgstr "クラスを再開する"
+
+#: cgi-bin/printers.c:152
msgid "Resume Printer"
-msgstr "プリンタを再開"
+msgstr "プリンターを再開する"
+
+#: ppdc/sample.c:128
msgid "Return Address"
-msgstr "差出人住所"
+msgstr "アドレスを戻す"
+
+#: ppdc/sample.c:137
msgid "Return Address - 3/4 x 2\""
-msgstr "差出人住所 - 3/4 x 2\""
+msgstr "アドレスを戻す ー 3/4 x 2\""
+
+#: ppdc/sample.c:421
msgid "Rewind"
-msgstr "巻き戻す"
+msgstr "戻る"
+
+#: cups/adminutil.c:2159
+#, c-format
msgid "Running command: %s %s -N -A %s -c '%s'\n"
-msgstr "コマンドを実行中:%s %s -N -A %s -c '%s'\n"
+msgstr "コマンドを実行中: %s %s -N -A %s -c '%s'\n"
+
+#: backend/scsi-irix.c:70 backend/scsi-linux.c:83
msgid "SCSI Printer"
-msgstr "SCSI プリンタ"
+msgstr "SCSI プリンター"
+
+#: cups/snmp.c:994
msgid "SEQUENCE uses indefinite length"
-msgstr "SEQUENCE に使われている長さが不定です"
+msgstr "SEQUENCE は不定長を使用しています"
+
+#: cups/http-support.c:1203
msgid "See Other"
-msgstr "その他を参照"
+msgstr "残りを見てください"
+
+#: backend/serial.c:784 backend/serial.c:943 backend/serial.c:1066
+#: backend/serial.c:1160
+#, c-format
msgid "Serial Port #%d"
-msgstr "シリアルポート #%d"
+msgstr "シリアルーポート #%d"
+
+#: cgi-bin/ipp-var.c:1037
msgid "Server Restarted"
-msgstr "サーバが再起動されました"
+msgstr "再起動されたサーバー"
+
+#: cgi-bin/ipp-var.c:1043
msgid "Server Security Auditing"
-msgstr "サーバのセキュリティ監査"
+msgstr "サーバーのセキュリティーチェック"
+
+#: cgi-bin/ipp-var.c:1039
msgid "Server Started"
-msgstr "サーバが開始されました"
+msgstr "開始されたサーバー"
+
+#: cgi-bin/ipp-var.c:1041
msgid "Server Stopped"
-msgstr "サーバが停止されました"
+msgstr "停止されたサーバー"
+
+#: cups/http-support.c:1239
msgid "Service Unavailable"
-msgstr "サービスを利用できません"
+msgstr "利用できないサービス"
+
+#: cgi-bin/admin.c:2790 cgi-bin/admin.c:2836 cgi-bin/admin.c:2993
+#: cgi-bin/admin.c:3012
msgid "Set Allowed Users"
-msgstr "許可するユーザを設定"
+msgstr "許可するユーザーの設定"
+
+#: cgi-bin/admin.c:3039
msgid "Set As Server Default"
-msgstr "サーバのデフォルトとして設定"
+msgstr "サーバーをデフォルトに設定"
+
+#: cgi-bin/admin.c:3139
msgid "Set Class Options"
msgstr "クラスオプションを設定"
+
+#: cgi-bin/admin.c:3139 cgi-bin/admin.c:3308 cgi-bin/admin.c:3663
msgid "Set Printer Options"
-msgstr "プリンタオプションを設定"
+msgstr "プリンターオプションの設定"
+
+#: cgi-bin/admin.c:3833 cgi-bin/admin.c:3877 cgi-bin/admin.c:3895
msgid "Set Publishing"
-msgstr "公開を設定"
+msgstr "公開の設定"
+
+#: ppdc/sample.c:129
msgid "Shipping Address"
-msgstr "送付先住所"
+msgstr "発送アドレス"
+
+#: ppdc/sample.c:138
msgid "Shipping Address - 2 5/16 x 4\""
-msgstr "送付先住所 - 2 5/16 x 4\""
+msgstr "発送アドレス - 2 5/16 x 4\""
+
+#: ppdc/sample.c:245
msgid "Short-Edge (Landscape)"
-msgstr "短辺(横)"
+msgstr "短辺 (横原稿)"
+
+#: ppdc/sample.c:260
msgid "Special Paper"
-msgstr "特殊紙"
+msgstr "スペシャルペーパー"
+
+#: ppdc/sample.c:313
msgid "Standard"
msgstr "標準"
+
+#: cgi-bin/admin.c:3526
msgid "Starting Banner"
msgstr "開始バナー"
+
+#: ppdc/sample.c:118
msgid "Statement"
-msgstr "ステートメント"
+msgstr "記述"
+
+#: ppdc/sample.c:223
msgid "Stylus Color Series"
msgstr "Stylus Color シリーズ"
+
+#: ppdc/sample.c:229
msgid "Stylus Photo Series"
msgstr "Stylus Photo シリーズ"
+
+#: ppdc/sample.c:119
msgid "Super A"
-msgstr "Super A"
+msgstr "スーパー A"
+
+#: ppdc/sample.c:120
msgid "Super B"
-msgstr "Super B"
+msgstr "スーパー B"
+
+#: ppdc/sample.c:125
msgid "Super B/A3"
-msgstr "Super B/A3"
+msgstr "スーパー B/A3"
+
+#: cups/http-support.c:1185
msgid "Switching Protocols"
-msgstr "プロトコルを切り替え中"
+msgstr "プロトコルの変更"
+
+#: ppdc/sample.c:121
msgid "Tabloid"
-msgstr "Tabloid"
+msgstr "タブロイド"
+
+#: ppdc/sample.c:122
msgid "Tabloid (Oversize)"
-msgstr "Tabloid(特大)"
+msgstr "タブロイド (特大)"
+
+#: ppdc/sample.c:314
msgid "Tear"
-msgstr "切り取る"
+msgstr "Tear"
+
+#: ppdc/sample.c:419
msgid "Tear-Off"
-msgstr "切り取る"
+msgstr "Tear-Off"
+
+#: ppdc/sample.c:360
msgid "Tear-Off Adjust Position"
-msgstr "切り取り調整位置"
+msgstr "Tear-Off 位置調節"
+
+#: scheduler/ipp.c:7309
+#, c-format
msgid "The PPD file \"%s\" could not be found."
-msgstr "PPD ファイル“%s”が見つかりませんでした。"
+msgstr "PPD ファイル \"%s\" が見つかりません。"
+
+#: scheduler/ipp.c:7296
+#, c-format
msgid "The PPD file \"%s\" could not be opened: %s"
-msgstr "PPD ファイル“%s”を開けませんでした:%s"
+msgstr "PPD ファイル \"%s\" が開きませんでした: %s"
+
+#: cgi-bin/admin.c:638
msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "クラス名には 127 文字以下のプリント可能な文字だけを使用できます。空白、スラッシュ(/)、ポンド記号(#)を含めることはできません。"
+msgstr "クラス名は 127 文字以内の表示可能文字から成り、空白、スラッシュ (/)、ポンド記号 (#) を含んではなりません。"
+
+#: scheduler/ipp.c:2165
msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
-msgstr "notify-lease-duration 属性はジョブ照会先では使用できません。"
+msgstr "notify-lease-duration 属性は、ジョブサブスクリプションと一緒に使うことはできません。"
+
+#: scheduler/ipp.c:2148 scheduler/ipp.c:6200
+#, c-format
msgid "The notify-user-data value is too large (%d > 63 octets)!"
-msgstr "notify-user-data 値が大きすぎます(%d は 63 オクテットを超えています)!"
+msgstr "notify-user-data 値が大きすぎます (%d > 63 オクテット)!"
+
+#: cgi-bin/admin.c:821
msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "プリンタ名には 127 文字以下のプリント可能な文字だけを使用できます。空白、スラッシュ(/)、ポンド記号(#)を含めることはできません。"
+msgstr "プリンター名は 127 文字以内の表示可能文字から成り、空白、スラッシュ (/)、ポンド記号 (#) を含んではなりません。"
+
+#: scheduler/ipp.c:1347
msgid "The printer or class is not shared!"
-msgstr "プリンタまたはクラスが共有されていません!"
+msgstr "プリンターまたはクラスは共有できません!"
+
+#: scheduler/ipp.c:872 scheduler/ipp.c:1178 scheduler/ipp.c:3848
+#: scheduler/ipp.c:3954 scheduler/ipp.c:5731 scheduler/ipp.c:6034
+#: scheduler/ipp.c:6347 scheduler/ipp.c:6884 scheduler/ipp.c:7514
+#: scheduler/ipp.c:7570 scheduler/ipp.c:7878 scheduler/ipp.c:8146
+#: scheduler/ipp.c:8236 scheduler/ipp.c:8269 scheduler/ipp.c:8589
+#: scheduler/ipp.c:8980 scheduler/ipp.c:9060 scheduler/ipp.c:10261
+#: scheduler/ipp.c:10714 scheduler/ipp.c:11042 scheduler/ipp.c:11109
+#: scheduler/ipp.c:11392
msgid "The printer or class was not found."
-msgstr "プリンタまたはクラスが見つかりませんでした。"
+msgstr "プリンターまたはクラスが見つかりませんでした。"
+
+#: scheduler/ipp.c:978 scheduler/ipp.c:2355
+#, c-format
msgid "The printer-uri \"%s\" contains invalid characters."
-msgstr "printer-uri“%s”に無効な文字が含まれています。"
+msgstr "printer-uri \"%s\" には、無効な文字が含まれています。"
+
+#: scheduler/ipp.c:3793
msgid "The printer-uri attribute is required!"
-msgstr "printer-uri 属性は必須です!"
+msgstr "printer-uri 属性は必須です!"
+
+#: scheduler/ipp.c:962
msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
-msgstr "printer-uri は“ipp://HOSTNAME/classes/CLASSNAME”の形式である必要があります。"
+msgstr "printer-uri は、\"ipp://ホスト名/classes/クラス名\" 形式でなければなりません。"
+
+#: scheduler/ipp.c:2339
msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
-msgstr "printer-uri は“ipp://HOSTNAME/printers/PRINTERNAME”の形式である必要があります。"
+msgstr "printer-uri は \"ipp://ホスト名/printers/プリンター名\" 形式でなければなりません。"
+
+#: cgi-bin/admin.c:385
msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
-msgstr "照会先名には空白、スラッシュ(/)、疑問符(?)、ポンド記号(#)を含めることはできません。"
+msgstr "サブスクリプション名には、スペース、スラッシュ (/)、疑問府 (?)、ポンド記号 (#) を使用しないでください。"
+
+#: scheduler/ipp.c:6277
msgid "There are too many subscriptions."
-msgstr "照会先が多すぎます。"
+msgstr "サブスクリプションが多すぎます。"
+
+#: ppdc/sample.c:407
msgid "Thermal Transfer Media"
msgstr "熱転写メディア"
+
+#: filter/bannertops.c:636
msgid "Title: "
-msgstr "タイトル:"
+msgstr "タイトル: "
+
+#: backend/ipp.c:1664
msgid "Toner low."
msgstr "トナーが少なくなっています。"
+
+#: scheduler/ipp.c:1506
msgid "Too many active jobs."
msgstr "アクティブなジョブが多すぎます。"
+
+#: scheduler/ipp.c:1444
+#, c-format
msgid "Too many job-sheets values (%d > 2)!"
-msgstr "job-sheets 値が多すぎます(%d は 2 を超えています)!"
+msgstr "job-sheets 値が多すぎます (%d > 2)!"
+
+#: scheduler/ipp.c:2659
+#, c-format
msgid "Too many printer-state-reasons values (%d > %d)!"
-msgstr "printer-state-reasons 値が多すぎます(%d は %d を超えています)!"
+msgstr "printer-state-reasons 値が多すぎます (%d > %d)!"
+
+#: ppdc/sample.c:261
msgid "Transparency"
-msgstr "透明度"
+msgstr "OHP シート"
+
+#: ppdc/sample.c:256
msgid "Tray"
msgstr "トレイ"
+
+#: ppdc/sample.c:236
msgid "Tray 1"
msgstr "トレイ 1"
+
+#: ppdc/sample.c:237
msgid "Tray 2"
msgstr "トレイ 2"
+
+#: ppdc/sample.c:238
msgid "Tray 3"
msgstr "トレイ 3"
+
+#: ppdc/sample.c:239
msgid "Tray 4"
msgstr "トレイ 4"
+
+#: cups/http-support.c:1224
msgid "URI Too Long"
-msgstr "URI が長すぎます"
+msgstr "URI が長過ぎます"
+
+#: ppdc/sample.c:88
msgid "US Executive"
-msgstr "US Executive"
+msgstr "US エグゼクティブ"
+
+#: ppdc/sample.c:91
msgid "US Fanfold"
msgstr "US Fanfold"
+
+#: ppdc/sample.c:105
msgid "US Ledger"
-msgstr "US Ledger"
+msgstr "US レジャー"
+
+#: ppdc/sample.c:106
msgid "US Legal"
-msgstr "リーガル"
+msgstr "US リーガル"
+
+#: ppdc/sample.c:107
msgid "US Legal (Oversize)"
-msgstr "リーガル(特大)"
+msgstr "US リーガル (特大)"
+
+#: ppdc/sample.c:108
msgid "US Letter"
-msgstr "レター"
+msgstr "US レター"
+
+#: ppdc/sample.c:109
msgid "US Letter (Oversize)"
-msgstr "レター(特大)"
+msgstr "US レター (特大)"
+
+#: ppdc/sample.c:110
msgid "US Letter (Small)"
-msgstr "レター(小)"
+msgstr "US レター (小)"
+
+#: backend/serial.c:797
+#, c-format
msgid "USB Serial Port #%d"
msgstr "USB シリアルポート #%d"
+
+#: cgi-bin/admin.c:1921 cgi-bin/admin.c:1934 cgi-bin/admin.c:1958
msgid "Unable to access cupsd.conf file:"
-msgstr "cupsd.conf ファイルにアクセスできません:"
+msgstr "cupsd.conf ファイルにアクセスできません:"
+
+#: cgi-bin/admin.c:437
msgid "Unable to add RSS subscription:"
-msgstr "RSS 照会先を追加できません:"
+msgstr " RSS 購読を追加できません:"
+
+#: cgi-bin/admin.c:704
msgid "Unable to add class:"
-msgstr "クラスを追加できません:"
+msgstr "クラスを追加できません:"
+
+#: scheduler/ipp.c:1550
+#, c-format
msgid "Unable to add job for destination \"%s\"!"
-msgstr "送信先“%s”のジョブを追加できません!"
+msgstr "宛先\"%s\"にジョブを追加できません!"
+
+#: cgi-bin/admin.c:953 cgi-bin/admin.c:1312
msgid "Unable to add printer:"
-msgstr "プリンタを追加できません:"
+msgstr "プリンターを追加ができません:"
+
+#: scheduler/ipp.c:1292
msgid "Unable to allocate memory for file types!"
-msgstr "ファイルタイプ用にメモリを割り当てられません!"
+msgstr "ファイルタイプ用にメモリを割り当てられません!"
+
+#: cgi-bin/admin.c:1418
msgid "Unable to cancel RSS subscription:"
-msgstr "RSS 照会先をキャンセルできません:"
+msgstr "RSS 購読をキャンセルできません:"
+
+#: cgi-bin/admin.c:3878
msgid "Unable to change printer-is-shared attribute:"
-msgstr "printer-is-shared 属性を変更できません:"
+msgstr "printer-is-shared 属性を変更することができません:"
+
+#: cgi-bin/admin.c:2994
msgid "Unable to change printer:"
-msgstr "プリンタを変更できません:"
+msgstr "プリンターを変更できません:"
+
+#: cgi-bin/admin.c:1598 cgi-bin/admin.c:1762
msgid "Unable to change server settings:"
-msgstr "サーバ設定を変更できません:"
+msgstr "サーバーの設定を変更できません:"
+
+#: cups/adminutil.c:941 cups/util.c:1672
msgid "Unable to connect to host."
-msgstr "ホストに接続できません。"
+msgstr "ホストに接続できません"
+
+#: cups/adminutil.c:737
+#, c-format
msgid "Unable to copy 64-bit CUPS printer driver files (%d)!"
-msgstr "64 ビット CUPS プリンタ・ドライバ・ファイルをコピーできません(%d)!"
+msgstr "64-bit 版の CUPS プリンタードライバーファイルをコピーできません (%d)!"
+
+#: cups/adminutil.c:702
+#, c-format
msgid "Unable to copy 64-bit Windows printer driver files (%d)!"
-msgstr "64 ビット Windows プリンタ・ドライバ・ファイルをコピーできません(%d)!"
+msgstr "64-bit 版の Windows プリンタードライバーをコピーできません (%d)!"
+
+#: cups/adminutil.c:533
+#, c-format
msgid "Unable to copy CUPS printer driver files (%d)!"
-msgstr "CUPS プリンタ・ドライバ・ファイルをコピーできません(%d)!"
+msgstr "複数の CUPS プリンタードライバーファイルをコピーできません (%d)!"
+
+#: scheduler/ipp.c:2776
+#, c-format
msgid "Unable to copy PPD file - %s!"
-msgstr "PPD ファイルをコピーできません - %s!"
+msgstr "PPD ファイルをコピーできません! - %s"
+
+#: scheduler/ipp.c:2842
msgid "Unable to copy PPD file!"
-msgstr "PPD ファイルをコピーできません!"
+msgstr "PPD ファイルをコピーできません!"
+
+#: cups/adminutil.c:498
+#, c-format
msgid "Unable to copy Windows 2000 printer driver files (%d)!"
-msgstr "Windows 2000 プリンタ・ドライバ・ファイルをコピーできません(%d)!"
+msgstr "複数の Windows 2000 プリンタードライバーファイルをコピーできません (%d)!"
+
+#: cups/adminutil.c:621
+#, c-format
msgid "Unable to copy Windows 9x printer driver files (%d)!"
-msgstr "Windows 9x プリンタ・ドライバ・ファイルをコピーできません(%d)!"
+msgstr "複数の Windows 9x プリンタードライバーファイルをコピーできません (%d)!"
+
+#: scheduler/ipp.c:2753
+#, c-format
msgid "Unable to copy interface script - %s!"
-msgstr "インターフェイス・スクリプトをコピーできません - %s!"
+msgstr "インターフェイススクリプトをコピーできません! - %s"
+
+#: cups/util.c:613 cups/util.c:1732
msgid "Unable to create printer-uri!"
-msgstr "printer-uri を作成できません!"
+msgstr "printer-uri を作成できません!"
+
+#: cgi-bin/admin.c:1812 cgi-bin/admin.c:1824
msgid "Unable to create temporary file:"
-msgstr "一時ファイルを作成できません:"
+msgstr "テンポラリファイルを作成できません:"
+
+#: cgi-bin/admin.c:2115
msgid "Unable to delete class:"
-msgstr "クラスを削除できません:"
+msgstr "クラスを削除できません:"
+
+#: cgi-bin/admin.c:2200
msgid "Unable to delete printer:"
-msgstr "プリンタを削除できません:"
+msgstr "プリンターを削除できません:"
+
+#: cgi-bin/classes.c:245 cgi-bin/printers.c:254
msgid "Unable to do maintenance command:"
-msgstr "保守コマンドを実行できません:"
+msgstr "メンテナンスコマンドを実行できません:"
+
+#: cgi-bin/admin.c:1936
msgid "Unable to edit cupsd.conf files larger than 1MB!"
-msgstr "1MB を超える cupsd.conf ファイルは編集できません!"
+msgstr "1MB 以上の cupsd.conf ファイルは編集できません!"
+
+#: cgi-bin/ipp-var.c:362
msgid "Unable to find destination for job!"
-msgstr "ジョブの送信先が見つかりません!"
+msgstr "ジョブの宛先が見つかりません!"
+
+#: cups/http-support.c:1430
msgid "Unable to find printer!\n"
-msgstr "プリンタが見つかりません!\n"
+msgstr "プリンターが見つかりません!\n"
+
+#: cgi-bin/classes.c:435
msgid "Unable to get class list:"
-msgstr "クラスリストを取得できません:"
+msgstr "クラスリストを取得できません:"
+
+#: cgi-bin/classes.c:534
msgid "Unable to get class status:"
-msgstr "クラスの状況を取得できません:"
+msgstr "クラスの状態を取得できません:"
+
+#: cgi-bin/admin.c:1213
msgid "Unable to get list of printer drivers:"
-msgstr "プリンタドライバのリストを取得できません:"
+msgstr "プリンタードライバーのリストを取得できません:"
+
+#: cgi-bin/admin.c:2844
msgid "Unable to get printer attributes:"
-msgstr "プリンタ属性を取得できません:"
+msgstr "プリンター属性を取得できません:"
+
+#: cgi-bin/printers.c:452
msgid "Unable to get printer list:"
-msgstr "プリンタリストを取得できません:"
+msgstr "プリンターリストを取得できません:"
+
+#: cgi-bin/printers.c:554
msgid "Unable to get printer status:"
-msgstr "プリンタの状況を取得できません:"
+msgstr "プリンターの状態を取得できません:"
+
+#: cups/adminutil.c:576 cups/adminutil.c:780
+#, c-format
msgid "Unable to install Windows 2000 printer driver files (%d)!"
-msgstr "Windows 2000 プリンタ・ドライバ・ファイルをインストールできません(%d)!"
+msgstr "複数の Windows 2000 プリンタードライバーファイルをインストールできません (%d)!"
+
+#: cups/adminutil.c:650
+#, c-format
msgid "Unable to install Windows 9x printer driver files (%d)!"
-msgstr "Windows 9x プリンタ・ドライバ・ファイルをインストールできません(%d)!"
+msgstr "複数の Windows 9x プリンタードライバーファイルをインストールできません (%d)!"
+
+#: cgi-bin/admin.c:703
msgid "Unable to modify class:"
-msgstr "クラスを変更できません:"
+msgstr "クラスを変更できません:"
+
+#: cgi-bin/admin.c:952 cgi-bin/admin.c:1311
msgid "Unable to modify printer:"
-msgstr "プリンタを変更できません:"
+msgstr "プリンターを変更できません:"
+
+#: cgi-bin/ipp-var.c:498
msgid "Unable to move job"
msgstr "ジョブを移動できません"
+
+#: cgi-bin/ipp-var.c:500
msgid "Unable to move jobs"
-msgstr "ジョブを移動できません"
+msgstr "複数のジョブを移動できません"
+
+#: cups/ppd.c:335
msgid "Unable to open PPD file"
-msgstr "PPD ファイルを開けません"
+msgstr "PPD ファイルを読み込むことができません"
+
+#: cgi-bin/admin.c:3190
msgid "Unable to open PPD file:"
-msgstr "PPD ファイルを開けません:"
+msgstr "PPD ファイルを読み込むことができません:"
+
+#: cgi-bin/admin.c:2570
msgid "Unable to open cupsd.conf file:"
-msgstr "cupsd.conf ファイルを開けません:"
+msgstr "cupsd.conf ファイルを開けません:"
+
+#: scheduler/ipp.c:6682
+#, c-format
msgid "Unable to open document %d in job %d!"
-msgstr "ジョブ %2$d で書類 %1$d を開けません!"
+msgstr "ドキュメント %d (ジョブ %d)を開けません!"
+
+#: cgi-bin/ipp-var.c:771
msgid "Unable to print test page:"
-msgstr "テストページをプリントできません:"
+msgstr "テストページを印刷できません:"
+
+#: cups/adminutil.c:2190
+#, c-format
msgid "Unable to run \"%s\": %s\n"
-msgstr "“%s”を実行できません:%s\n"
+msgstr "\"%s\" を実行できません: %s\n"
+
+#: cgi-bin/ipp-var.c:575 cgi-bin/ipp-var.c:595
msgid "Unable to send command to printer driver!"
-msgstr "プリンタドライバにコマンドを送信できません!"
+msgstr "プリンタードライバーにコマンドを送信できません!"
+
+#: cups/adminutil.c:832
+#, c-format
msgid "Unable to set Windows printer driver (%d)!"
-msgstr "Windows プリンタドライバを設定できません(%d)!"
+msgstr "Windows プリンタードライバーを設定できません (%d)!"
+
+#: cgi-bin/admin.c:3779
msgid "Unable to set options:"
-msgstr "オプションを設定できません:"
+msgstr "オプションを設定できません:"
+
+#: cgi-bin/admin.c:3081
msgid "Unable to set server default:"
-msgstr "サーバのデフォルトを設定できません:"
+msgstr "サーバーをデフォルトに設定できません:"
+
+#: cgi-bin/admin.c:1874
msgid "Unable to upload cupsd.conf file:"
-msgstr "cupsd.conf ファイルをアップロードできません:"
+msgstr "cupsd.conf ファイルをアップロードできません:"
+
+#: backend/usb-darwin.c:1816 backend/usb-darwin.c:1838
msgid "Unable to use legacy USB class driver!\n"
-msgstr "古い USB クラスドライバは使用できません!\n"
+msgstr "古いタイプの USB クラスドライバーは使用できません!\n"
+
+#: cups/http-support.c:1212
msgid "Unauthorized"
-msgstr "未承認"
+msgstr "不許可"
+
+#: cgi-bin/admin.c:3479
msgid "Units"
msgstr "ユニット"
+
+#: cups/http-support.c:1243 cups/ppd.c:359
msgid "Unknown"
-msgstr "不明"
+msgstr "未知"
+
+#: backend/ipp.c:1711
+#, c-format
msgid "Unknown printer error (%s)!"
-msgstr "不明なプリンタエラーです(%s)!"
+msgstr "未知のプリンターエラー (%s) です!"
+
+#: scheduler/ipp.c:10915
+#, c-format
msgid "Unknown printer-error-policy \"%s\"."
-msgstr "printer-error-policy“%s”が不明です。"
+msgstr "\"%s\" は未知の printer-error-policy です。"
+
+#: scheduler/ipp.c:10899
+#, c-format
msgid "Unknown printer-op-policy \"%s\"."
-msgstr "printer-op-policy“%s”が不明です。"
+msgstr "\"%s\" は未知の printer-op-policy です。"
+
+#: scheduler/ipp.c:406
+#, c-format
msgid "Unsupported character set \"%s\"!"
-msgstr "文字セット“%s”には対応していません!"
+msgstr "\"%s\" はサポートされていない文字セットです!"
+
+#: scheduler/ipp.c:8555 scheduler/ipp.c:9850
+#, c-format
msgid "Unsupported compression \"%s\"!"
-msgstr "圧縮“%s”には対応していません!"
+msgstr "\"%s\" はサポートされていない圧縮形式です!"
+
+#: scheduler/ipp.c:11345
+#, c-format
msgid "Unsupported compression attribute %s!"
-msgstr "圧縮属性 %s には対応していません!"
+msgstr "%s はサポートされていない圧縮属性です!"
+
+#: scheduler/ipp.c:11373
+#, c-format
msgid "Unsupported format \"%s\"!"
-msgstr "“%s”の形式には対応していません!"
+msgstr "\"%s\" はサポートされていない形式です!"
+
+#: scheduler/ipp.c:1410 scheduler/ipp.c:9984
+#, c-format
msgid "Unsupported format '%s'!"
-msgstr "‘%s’の形式には対応していません!"
+msgstr "'%s' はサポートされていない形式です!"
+
+#: scheduler/ipp.c:8689 scheduler/ipp.c:9967
+#, c-format
msgid "Unsupported format '%s/%s'!"
-msgstr "‘%s/%s’の形式には対応していません!"
+msgstr "'%s/%s' はサポートされていない形式です!"
+
+#: cups/snmp.c:1111
msgid "Unsupported value type"
-msgstr "対応していない値タイプです"
+msgstr "サポートされていない型の値です"
+
+#: cups/http-support.c:1227
msgid "Upgrade Required"
msgstr "アップグレードが必要です"
-msgid "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n"
-msgstr "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n"
+
+#: systemv/lpadmin.c:805
+msgid ""
+"Usage:\n"
+"\n"
+" lpadmin [-h server] -d destination\n"
+" lpadmin [-h server] -x destination\n"
+" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+" [-r remove-class] [-v device] [-D description]\n"
+" [-P ppd-file] [-o name=value]\n"
+" [-u allow:user,user] [-u deny:user,user]\n"
+"\n"
+msgstr ""
+"Usage:\n"
+"\n"
+" lpadmin [-h サーバー] -d 宛先\n"
+" lpadmin [-h サーバー] -x 宛先\n"
+" lpadmin [-h サーバー] -p プリンター [-c 追加クラス] [-i インターフェイス]\n"
+" [-m モデル] [-r 削除クラス] [-v デバイス]\n"
+" [-D 宛先] [-P PPD ファイル] [-o 名前=値]\n"
+" [-u allow:ユーザー,ユーザー] [-u deny:ユーザー,ユーザー]\n"
+"\n"
+
+#: filter/pdftops.c:93
+#, c-format
msgid "Usage: %s job user title copies options [filename]\n"
-msgstr "Usage: %s job user title copies options [filename]\n"
+msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル名]\n"
+
+#: backend/ipp.c:210 backend/lpd.c:184 backend/pap.c:228
+#: backend/parallel.c:127 backend/scsi.c:157 backend/serial.c:165
+#: backend/socket.c:132 backend/usb.c:183 filter/bannertops.c:118
+#: filter/hpgl-main.c:148 filter/imagetops.c:115 filter/imagetoraster.c:207
+#: filter/pstops.c:254 filter/rastertoepson.c:985 filter/rastertohp.c:712
+#: filter/rastertolabel.c:1133 filter/textcommon.c:518
+#, c-format
msgid "Usage: %s job-id user title copies options [file]\n"
-msgstr "Usage: %s job-id user title copies options [file]\n"
+msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル]\n"
+
+#: filter/gziptoany.c:53
+#, c-format
msgid "Usage: %s job-id user title copies options file\n"
-msgstr "Usage: %s job-id user title copies options file\n"
-msgid "Usage: convert [ options ]\n\nOptions:\n\n -f filename Set file to be converted (otherwise stdin)\n -o filename Set file to be generated (otherwise stdout)\n -i mime/type Set input MIME type (otherwise auto-typed)\n -j mime/type Set output MIME type (otherwise application/pdf)\n -P filename.ppd Set PPD file\n -a 'name=value ...' Set option(s)\n -U username Set username for job\n -J title Set title\n -c copies Set number of copies\n -u Remove the PPD file when finished\n -D Remove the input file when finished\n"
-msgstr "Usage: convert [ options ]\n\nOptions:\n\n -f filename Set file to be converted (otherwise stdin)\n -o filename Set file to be generated (otherwise stdout)\n -i mime/type Set input MIME type (otherwise auto-typed)\n -j mime/type Set output MIME type (otherwise application/pdf)\n -P filename.ppd Set PPD file\n -a 'name=value ...' Set option(s)\n -U username Set username for job\n -J title Set title\n -c copies Set number of copies\n -u Remove the PPD file when finished\n -D Remove the input file when finished\n"
-msgid "Usage: cupsaddsmb [options] printer1 ... printerN\n cupsaddsmb [options] -a\n\nOptions:\n -E Encrypt the connection to the server\n -H samba-server Use the named SAMBA server\n -U samba-user Authenticate using the named SAMBA user\n -a Export all printers\n -h cups-server Use the named CUPS server\n -v Be verbose (show commands)\n"
-msgstr "Usage: cupsaddsmb [options] printer1 ... printerN\n cupsaddsmb [options] -a\n\nOptions:\n -E Encrypt the connection to the server\n -H samba-server Use the named SAMBA server\n -U samba-user Authenticate using the named SAMBA user\n -a Export all printers\n -h cups-server Use the named CUPS server\n -v Be verbose (show commands)\n"
-msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]\n\nOptions:\n\n -E Enable encryption\n -U username Specify username\n -h server[:port] Specify server address\n\n --[no-]debug-logging Turn debug logging on/off\n --[no-]remote-admin Turn remote administration on/off\n --[no-]remote-any Allow/prevent access from the Internet\n --[no-]remote-printers Show/hide remote printers\n --[no-]share-printers Turn printer sharing on/off\n --[no-]user-cancel-any Allow/prevent users to cancel any job\n"
-msgstr "Usage: cupsctl [options] [param=value ... paramN=valueN]\n\nOptions:\n\n -E Enable encryption\n -U username Specify username\n -h server[:port] Specify server address\n\n --[no-]debug-logging Turn debug logging on/off\n --[no-]remote-admin Turn remote administration on/off\n --[no-]remote-any Allow/prevent access from the Internet\n --[no-]remote-printers Show/hide remote printers\n --[no-]share-printers Turn printer sharing on/off\n --[no-]user-cancel-any Allow/prevent users to cancel any job\n"
-msgid "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n\n-c config-file Load alternate configuration file\n-f Run in the foreground\n-F Run in the foreground but detach\n-h Show this usage message\n-l Run cupsd from launchd(8)\n"
-msgstr "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n\n-c config-file Load alternate configuration file\n-f Run in the foreground\n-F Run in the foreground but detach\n-h Show this usage message\n-l Run cupsd from launchd(8)\n"
-msgid "Usage: cupsfilter -m mime/type [ options ] filename\n\nOptions:\n\n -c cupsd.conf Set cupsd.conf file to use\n -j job-id[,N] Filter file N from the specified job (default is file 1)\n -n copies Set number of copies\n -o name=value Set option(s)\n -p filename.ppd Set PPD file\n -t title Set title\n"
-msgstr "Usage: cupsfilter -m mime/type [ options ] filename\n\nOptions:\n\n -c cupsd.conf Set cupsd.conf file to use\n -j job-id[,N] Filter file N from the specified job (default is file 1)\n -n copies Set number of copies\n -o name=value Set option(s)\n -p filename.ppd Set PPD file\n -t title Set title\n"
-msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n cupstestdsc [options] -\n\nOptions:\n\n -h Show program usage\n\n Note: this program only validates the DSC comments, not the PostScript itself.\n"
-msgstr "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n cupstestdsc [options] -\n\nOptions:\n\n -h Show program usage\n\n Note: this program only validates the DSC comments, not the PostScript itself.\n"
-msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n program | cupstestppd [options] -\n\nOptions:\n\n -R root-directory Set alternate root\n -W {all,none,constraints,defaults,duplex,filters,translations}\n Issue warnings instead of errors\n -q Run silently\n -r Use 'relaxed' open mode\n -v Be slightly verbose\n -vv Be very verbose\n"
-msgstr "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n program | cupstestppd [options] -\n\nOptions:\n\n -R root-directory Set alternate root\n -W {all,none,constraints,defaults,duplex,filters,translations}\n Issue warnings instead of errors\n -q Run silently\n -r Use 'relaxed' open mode\n -v Be slightly verbose\n -vv Be very verbose\n"
+msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション ファイル\n"
+
+#: scheduler/cupsfilter.c:1297
+msgid ""
+"Usage: convert [ options ]\n"
+"\n"
+"Options:\n"
+"\n"
+" -f filename Set file to be converted (otherwise stdin)\n"
+" -o filename Set file to be generated (otherwise stdout)\n"
+" -i mime/type Set input MIME type (otherwise auto-typed)\n"
+" -j mime/type Set output MIME type (otherwise application/pdf)\n"
+" -P filename.ppd Set PPD file\n"
+" -a 'name=value ...' Set option(s)\n"
+" -U username Set username for job\n"
+" -J title Set title\n"
+" -c copies Set number of copies\n"
+" -u Remove the PPD file when finished\n"
+" -D Remove the input file when finished\n"
+msgstr ""
+"使い方: convert [ オプション ]\n"
+"\n"
+"オプション:\n"
+"\n"
+" -f ファイル名 変換するファイルを指定する (省略すると標準入力)\n"
+" -o ファイル名 生成されるファイルを指定する (省略すると標準出力)\n"
+" -i MIME/タイプ 入力 MIME タイプを指定する (省略すると自動設定)\n"
+" -j MIME/タイプ 出力 MIME タイプを指定する (省略すると application/pdf)\n"
+" -P ファイル名.ppd PPD ファイルを指定する\n"
+" -a '名前=値 ...' オプションを指定する\n"
+" -U ユーザー名 ジョブのユーザー名を指定する\n"
+" -J タイトル タイトルを指定する\n"
+" -c コピー数 コピー数を指定する\n"
+" -u 完了時に PPD ファイルを削除する\n"
+" -D 完了時に入力ファイルを削除する\n"
+
+#: systemv/cupsaddsmb.c:286
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+" cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+" -E Encrypt the connection to the server\n"
+" -H samba-server Use the named SAMBA server\n"
+" -U samba-user Authenticate using the named SAMBA user\n"
+" -a Export all printers\n"
+" -h cups-server Use the named CUPS server\n"
+" -v Be verbose (show commands)\n"
+msgstr ""
+"使い方: cupsaddsmb [オプション] プリンター ... プリンターN\n"
+" cupsaddsmb [オプション] -a\n"
+"\n"
+"オプション:\n"
+" -E サーバーとの接続を暗号化する\n"
+" -H sambaサーバー 指定の SAMBA サーバーを使う\n"
+" -U sambaユーザー 指定の SAMBA ユーザーを使って認証する\n"
+" -a すべてのプリンターをエキスポートする\n"
+" -h cupsサーバー 指定の CUPS サーバーを使う\n"
+" -v 冗長にする (コマンドを表示する)\n"
+
+#: systemv/cupsctl.c:202
+msgid ""
+"Usage: cupsctl [options] [param=value ... paramN=valueN]\n"
+"\n"
+"Options:\n"
+"\n"
+" -E Enable encryption\n"
+" -U username Specify username\n"
+" -h server[:port] Specify server address\n"
+"\n"
+" --[no-]debug-logging Turn debug logging on/off\n"
+" --[no-]remote-admin Turn remote administration on/off\n"
+" --[no-]remote-any Allow/prevent access from the Internet\n"
+" --[no-]remote-printers Show/hide remote printers\n"
+" --[no-]share-printers Turn printer sharing on/off\n"
+" --[no-]user-cancel-any Allow/prevent users to cancel any job\n"
+msgstr ""
+"使い方: cupsctl [オプション] [パラメータ=値 ... パラメータN=値N]\n"
+"\n"
+"オプション:\n"
+"\n"
+" -E 暗号化を有効にする\n"
+" -U ユーザ名 ユーザー名を指定する\n"
+" -h サーバー[:ポート] サーバーアドレスを指定する\n"
+"\n"
+" --[no-]debug-logging デバッグログの有効/無効を切り替える\n"
+" --[no-]remote-admin リモート管理の有効/無効を切り替える\n"
+" --[no-]remote-any インターネットからのアクセスを許可/禁止する\n"
+" --[no-]remote-printers リモートプリンターを表示/非表示にする\n"
+" --[no-]share-printers プリンター共有の有効/無効を切り替える\n"
+" --[no-]user-cancel-any あらゆるジョブのキャンセルをユーザーに許可/禁止する\n"
+
+#: scheduler/main.c:2057
+msgid ""
+"Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c config-file Load alternate configuration file\n"
+"-f Run in the foreground\n"
+"-F Run in the foreground but detach\n"
+"-h Show this usage message\n"
+"-l Run cupsd from launchd(8)\n"
+msgstr ""
+"使い方: cupsd [-c 設定ファイル] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c 設定ファイル 別の設定ファイルをロードする\n"
+"-f フォアグラウンドで実行する\n"
+"-F フォアグラウンドで実行するがデタッチする\n"
+"-h この使い方を表示する\n"
+"-l launchd(8) から cupsd を実行する\n"
+
+#: scheduler/cupsfilter.c:1285
+msgid ""
+"Usage: cupsfilter -m mime/type [ options ] filename\n"
+"\n"
+"Options:\n"
+"\n"
+" -c cupsd.conf Set cupsd.conf file to use\n"
+" -j job-id[,N] Filter file N from the specified job (default is file 1)\n"
+" -n copies Set number of copies\n"
+" -o name=value Set option(s)\n"
+" -p filename.ppd Set PPD file\n"
+" -t title Set title\n"
+msgstr ""
+"使い方: cupsfilter -m MIME/タイプ [ オプション ] ファイル名\n"
+"\n"
+"オプション:\n"
+"\n"
+" -c cupsd.conf 利用する cupsd.conf ファイルを指定する\n"
+" -n コピー数 コピー数を指定する\n"
+" -o 名前=値 オプションを指定する\n"
+" -p ファイル名.ppd PPD ファイルを指定する\n"
+" -t タイトル タイトルを指定する\n"
+
+#: systemv/cupstestdsc.c:430
+msgid ""
+"Usage: cupstestdsc [options] filename.ps [... filename.ps]\n"
+" cupstestdsc [options] -\n"
+"\n"
+"Options:\n"
+"\n"
+" -h Show program usage\n"
+"\n"
+" Note: this program only validates the DSC comments, not the PostScript itself.\n"
+msgstr ""
+"使い方: cupstestdsc [オプション] ファイル名.ps [... ファイル名.ps]\n"
+" cupstestdsc [オプション] -\n"
+"\n"
+"オプション:\n"
+"\n"
+" -h プログラムの使い方を表示する\n"
+"\n"
+" 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検証するものではありません。\n"
+
+#: systemv/cupstestppd.c:2928
+msgid ""
+"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
+" program | cupstestppd [options] -\n"
+"\n"
+"Options:\n"
+"\n"
+" -R root-directory Set alternate root\n"
+" -W {all,none,constraints,defaults,duplex,filters,translations}\n"
+" Issue warnings instead of errors\n"
+" -q Run silently\n"
+" -r Use 'relaxed' open mode\n"
+" -v Be slightly verbose\n"
+" -vv Be very verbose\n"
+msgstr ""
+"使い方: cupstestppd [オプション] ファイル名1.ppd[.gz] [...ファイル名N.ppd[.gz]]\n"
+" プログラム | cupstestppd [オプション] -\n"
+"\n"
+"オプション:\n"
+"\n"
+" -R ルートディレクトリ 別のルートを指定する\n"
+" -W {all,none,constraints,defaults,filters,translations}\n"
+" エラーの代わりに警告を発行する\n"
+" -q 詳細は表示しない\n"
+" -r 寛容モード\n"
+" -v やや詳細に表示する\n"
+" -vv 非常に詳細に表示する\n"
+
+#: systemv/lpmove.c:132
msgid "Usage: lpmove job/src dest\n"
-msgstr "Usage: lpmove job/src dest\n"
-msgid "Usage: lpoptions [-h server] [-E] -d printer\n lpoptions [-h server] [-E] [-p printer] -l\n lpoptions [-h server] [-E] -p printer -o option[=value] ...\n lpoptions [-h server] [-E] -x printer\n"
-msgstr "Usage: lpoptions [-h server] [-E] -d printer\n lpoptions [-h server] [-E] [-p printer] -l\n lpoptions [-h server] [-E] -p printer -o option[=value] ...\n lpoptions [-h server] [-E] -x printer\n"
+msgstr "使い方: lpmove ジョブ/ソース 宛先\n"
+
+#: systemv/lpoptions.c:540
+msgid ""
+"Usage: lpoptions [-h server] [-E] -d printer\n"
+" lpoptions [-h server] [-E] [-p printer] -l\n"
+" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+" lpoptions [-h server] [-E] -x printer\n"
+msgstr ""
+"使い方: lpoptions [-h サーバー] [-E] -d プリンター\n"
+" lpoptions [-h サーバー] [-E] [-p プリンター] -l\n"
+" lpoptions [-h サーバー] [-E] -p プリンター -o オプション[=値] ...\n"
+" lpoptions [-h サーバー] [-E] -x プリンター\n"
+
+#: systemv/lppasswd.c:493
msgid "Usage: lppasswd [-g groupname]\n"
-msgstr "Usage: lppasswd [-g groupname]\n"
-msgid "Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]\n"
-msgstr "Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]\n"
+msgstr "使い方: lppasswd [-g グループ名]\n"
+
+#: systemv/lppasswd.c:496
+msgid ""
+"Usage: lppasswd [-g groupname] [username]\n"
+" lppasswd [-g groupname] -a [username]\n"
+" lppasswd [-g groupname] -x [username]\n"
+msgstr ""
+"使い方: lppasswd [-g グループ名] [ユーザ名]\n"
+" lppasswd [-g グループ名] -a [ユーザ名]\n"
+" lppasswd [-g グループ名] -x [ユーザ名]\n"
+
+#: berkeley/lpq.c:663
msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
-msgstr "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
-msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -c catalog.po Load the specified message catalog.\n -d output-dir Specify the output directory.\n -l lang[,lang,...] Specify the output language(s) (locale).\n -m Use the ModelName value as the filename.\n -t Test PPDs instead of generating them.\n -v Be verbose (more v's for more verbosity).\n -z Compress PPD files using GNU zip.\n --cr End lines with CR (Mac OS 9).\n --crlf End lines with CR + LF (Windows).\n --lf End lines with LF (UNIX/Linux/Mac OS X).\n"
-msgstr "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -c catalog.po Load the specified message catalog.\n -d output-dir Specify the output directory.\n -l lang[,lang,...] Specify the output language(s) (locale).\n -m Use the ModelName value as the filename.\n -t Test PPDs instead of generating them.\n -v Be verbose (more v's for more verbosity).\n -z Compress PPD files using GNU zip.\n --cr End lines with CR (Mac OS 9).\n --crlf End lines with CR + LF (Windows).\n --lf End lines with LF (UNIX/Linux/Mac OS X).\n"
-msgid "Usage: ppdhtml [options] filename.drv >filename.html\n -D name=value Set named variable to value.\nOptions:\n -I include-dir Add include directory to search path.\n"
-msgstr "Usage: ppdhtml [options] filename.drv >filename.html\n -D name=value Set named variable to value.\nOptions:\n -I include-dir Add include directory to search path.\n"
-msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -I include-dir\n -o filename.drv\n"
-msgstr "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -I include-dir\n -o filename.drv\n"
-msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -o filename.ppd[.gz]\n"
-msgstr "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -o filename.ppd[.gz]\n"
-msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -v Be verbose (more v's for more verbosity).\n"
-msgstr "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -v Be verbose (more v's for more verbosity).\n"
+msgstr "使い方: lpq [-P 宛先] [-U ユーザー名] [-h ホスト名[:ポート]] [-l] [+間隔]\n"
+
+#: ppdc/ppdc.cxx:393
+msgid ""
+"Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n"
+"Options:\n"
+" -D name=value Set named variable to value.\n"
+" -I include-dir Add include directory to search path.\n"
+" -c catalog.po Load the specified message catalog.\n"
+" -d output-dir Specify the output directory.\n"
+" -l lang[,lang,...] Specify the output language(s) (locale).\n"
+" -m Use the ModelName value as the filename.\n"
+" -t Test PPDs instead of generating them.\n"
+" -v Be verbose (more v's for more verbosity).\n"
+" -z Compress PPD files using GNU zip.\n"
+" --cr End lines with CR (Mac OS 9).\n"
+" --crlf End lines with CR + LF (Windows).\n"
+" --lf End lines with LF (UNIX/Linux/Mac OS X).\n"
+msgstr ""
+"Usage: ppdc [オプション] ファイル名.drv [ ... ファイル名N.drv ]\n"
+"オプション:\n"
+" -D 変数名=値 変数名で指定した変数に値をセットする\n"
+" -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n"
+" -c catalog.po 指定したメッセージカタログをロードする\n"
+" -d output-dir 出力ディレクトリ(output-dir)を指定する\n"
+" -l lang[,lang,...] 出力言語を指定する。(複数可能)\n"
+" -m ModelName の値をファイル名として使用する\n"
+" -t PPD を出力しないでテストする\n"
+" -v 冗長出力を行う (v を追加してさらに冗長に)\n"
+" -z PPD ファイルを GNU zip を使って圧縮する\n"
+" --cr ラインの最後は CR (Mac OS 9 方式).\n"
+" --crlf ラインの最後は CR + LF (Windows 方式).\n"
+" --lf ラインの最後は LF (UNIX/Linux/Mac OS X 方式).\n"
+
+#: ppdc/ppdhtml.cxx:174
+msgid ""
+"Usage: ppdhtml [options] filename.drv >filename.html\n"
+" -D name=value Set named variable to value.\n"
+"Options:\n"
+" -I include-dir Add include directory to search path.\n"
+msgstr ""
+"使い方: ppdhtml [オプション] ファイル名.drv >ファイル名.html\n"
+" -D 変数名=値 変数名で指定した変数に値をセットする\n"
+"オプション:\n"
+" -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n"
+
+#: ppdc/ppdi.cxx:130
+msgid ""
+"Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n"
+"Options:\n"
+" -I include-dir\n"
+" -o filename.drv\n"
+msgstr ""
+"使い方: ppdi [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]\n"
+"オプション:\n"
+" -I インクルードディレクトリ\n"
+" -o ファイル名.drv\n"
+
+#: ppdc/ppdmerge.cxx:370
+msgid ""
+"Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n"
+"Options:\n"
+" -o filename.ppd[.gz]\n"
+msgstr ""
+"使い方: ppdmerge [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]\n"
+"オプション:\n"
+" -o ファイル名.ppd[.gz]\n"
+
+#: ppdc/ppdpo.cxx:255
+msgid ""
+"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n"
+"Options:\n"
+" -D name=value Set named variable to value.\n"
+" -I include-dir Add include directory to search path.\n"
+" -v Be verbose (more v's for more verbosity).\n"
+msgstr ""
+"使い方: ppdpo [オプション] -o ファイル名.po ファイル名.drv [ ... ファイル名N.drv ]\n"
+"オプション:\n"
+" -D 変数名=値 変数名で指定した変数に値をセットする\n"
+" -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n"
+" -v 冗長出力を行う (v を追加してさらに冗長に)\n"
+
+#: backend/snmp.c:224
msgid "Usage: snmp [host-or-ip-address]\n"
-msgstr "Usage: snmp [host-or-ip-address]\n"
+msgstr "使い方: snmp [ホストまたはIPアドレス]\n"
+
+#: cups/snmp.c:1063
msgid "Value uses indefinite length"
-msgstr "値に使われている長さが不定です"
+msgstr "値は不定長です"
+
+#: cups/snmp.c:1048
msgid "VarBind uses indefinite length"
-msgstr "VarBind に使われている長さが不定です"
+msgstr "VarBind は不定長です"
+
+#: cups/snmp.c:998
msgid "Version uses indefinite length"
-msgstr "バージョンに使われている長さが不定です"
+msgstr "Version は不定長です"
+
+#: backend/pap.c:328
+#, c-format
msgid "WARNING: Adding only the first %d printers found"
-msgstr "WARNING: 見つかったプリンタのうち最初の %d 台だけが追加されます"
+msgstr "WARNING: 発見した順番に %d 台のプリンターだけ追加します"
+
+#: backend/pap.c:1460 backend/usb-darwin.c:1679
+#, c-format
msgid "WARNING: Boolean expected for waiteof option \"%s\"\n"
-msgstr "WARNING: waiteof オプション“%s”は論理値でなければなりません\n"
+msgstr "WARNING: 論理値は、waiteof オプション \"%s\" であるべきです\n"
+
+#: backend/network.c:83 backend/pap.c:1293 backend/parallel.c:638
+#: backend/serial.c:1285 backend/usb-libusb.c:747 backend/usb-unix.c:583
msgid "WARNING: Failed to read side-channel request!\n"
-msgstr "WARNING: side-channel 要求の読み取りに失敗しました!\n"
+msgstr "WARNING: サイドチャンネルの読み出しに失敗しました!\n"
+
+#: filter/pstops.c:2227
+#, c-format
msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n"
-msgstr "WARNING: オプション“%s”は IncludeFeature 経由で取り込むことはできません!\n"
+msgstr "WARNING: オプション \"%s\" は IncludeFeature 経由で含めることはできません!\n"
+
+#: backend/pap.c:503
msgid "WARNING: Printer not responding\n"
-msgstr "WARNING: プリンタが応答しません\n"
+msgstr "WARNING: プリンターが反応しません\n"
+
+#: backend/pap.c:831 backend/pap.c:854
msgid "WARNING: Printer sent unexpected EOF\n"
-msgstr "WARNING: プリンタが予期しない EOF を送信しました\n"
+msgstr "WARNING: プリンターが意図しない EOF を返しました\n"
+
+#: backend/lpd.c:593
+#, c-format
msgid "WARNING: Remote host did not respond with command status byte after %d seconds!\n"
-msgstr "WARNING: リモートホストが %d 秒後にコマンド・ステータス・バイトで応答しませんでした!\n"
+msgstr "WARNING: リモートホストは %d 秒経ってもコマンド・ステータス・バイトを返しませんでした!\n"
+
+#: backend/lpd.c:1015 backend/lpd.c:1162
+#, c-format
msgid "WARNING: Remote host did not respond with control status byte after %d seconds!\n"
-msgstr "WARNING: リモートホストが %d 秒後に制御ステータスバイトで応答しませんでした!\n"
+msgstr "WARNING: リモートホストは %d 秒経ってもコントロール・ステータス・バイトを返しませんでした!\n"
+
+#: backend/lpd.c:1107
+#, c-format
msgid "WARNING: Remote host did not respond with data status byte after %d seconds!\n"
-msgstr "WARNING: リモートホストが %d 秒後にデータ・ステータス・バイトで応答しませんでした!\n"
+msgstr "WARNING: リモートホストは %d 秒経ってもデータ・ステータス・バイトを返しませんでした!\n"
+
+#: backend/scsi-irix.c:210 backend/scsi-linux.c:228
+#, c-format
msgid "WARNING: SCSI command timed out (%d); retrying...\n"
-msgstr "WARNING: SCSI コマンドがタイムアウトになりました(%d)。再試行中...\n"
+msgstr "WARNING: SCSI コマンドはタイムアウトしました (%d)。再試行中...\n"
+
+#: filter/pstops.c:1091
msgid "WARNING: This document does not conform to the Adobe Document Structuring Conventions and may not print correctly!\n"
-msgstr "WARNING: この書類は Adobe Document Structuring Conventions に適合していないため、正しくプリントできない可能性があります!\n"
+msgstr "WARNING: この書類は Adobe Document Structuring Conventions に適合しておらず、正しくプリントできない可能性があります!\n"
+
+#: backend/pap.c:492
+#, c-format
msgid "WARNING: Unable to open \"%s:%s\": %s\n"
-msgstr "WARNING: “%s:%s”を開けません:%s\n"
+msgstr "WARNING: \"%s:%s\": %s を開けません\n"
+
+#: backend/pap.c:637
msgid "WARNING: Unable to send PAP status request"
-msgstr "WARNING: PAP 状況要求を送信できません"
+msgstr "WARNING: PAP ステータス・リクエストを送信できません"
+
+#: backend/pap.c:867
+#, c-format
msgid "WARNING: Unexpected PAP packet of type %d\n"
-msgstr "WARNING: %d は予期しない PAP パケットタイプです\n"
+msgstr "WARNING: %d タイプの意図しない PAP パケット\n"
+
+#: backend/pap.c:872
+#, c-format
msgid "WARNING: Unknown PAP packet of type %d\n"
-msgstr "WARNING: %d は不明な PAP パケットタイプです\n"
+msgstr "WARNING: 未知の PAP パケットのタイプ %d\n"
+
+#: filter/pstops.c:2234
+#, c-format
msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n"
-msgstr "WARNING: オプション“%2$s”に不明な“%1$s”が選択されています!\n"
+msgstr "WARNING: \"%s\" (オプション \"%s\" 用) は未知の設定です!\n"
+
+#: filter/pstops.c:2220
+#, c-format
msgid "WARNING: Unknown option \"%s\"!\n"
-msgstr "WARNING: “%s”は不明なオプションです!\n"
+msgstr "WARNING: \"%s\" は未知のオプションです!\n"
+
+#: backend/serial.c:380
+#, c-format
msgid "WARNING: Unsupported baud rate %s!\n"
-msgstr "WARNING: ボーレート %s には対応していません!\n"
+msgstr "WARNING: %s はサポートしないボーレートです!\n"
+
+#: backend/pap.c:1474
+#, c-format
msgid "WARNING: number expected for status option \"%s\"\n"
-msgstr "WARNING: 状況オプション“%s”は数値でなければなりません\n"
+msgstr "WARNING: ステータス・オプションの期待値は \"%s\"\n"
+
+#: backend/ipp.c:578 backend/ipp.c:709 backend/lpd.c:828 backend/socket.c:318
+#, c-format
msgid "WARNING: recoverable: Network host '%s' is busy; will retry in %d seconds...\n"
-msgstr "WARNING: 回復可能:ネットワークホスト‘%s’はビジー状態です。%d 秒後に再試行します...\n"
+msgstr "WARNING: 回復可能: ネットワークホスト '%s' はビジー状態です (%d 秒後に再試行します...)\n"
+
+#: cups/adminutil.c:804
msgid "Warning, no Windows 2000 printer drivers are installed!"
-msgstr "警告、Windows 2000 プリンタドライバがインストールされていません!"
+msgstr "警告、Windows 2000 プリンタードライバーがインストールされていません!"
+
+#: cups/ppd.c:1865
msgid "Yes"
msgstr "はい"
+
+#: scheduler/client.c:2419
+#, c-format
msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
-msgstr "このページにアクセスするには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使用する必要があります。"
+msgstr "このページには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ってアクセスする必要があります。"
+
+#: ppdc/sample.c:87
msgid "You4 Envelope"
-msgstr "You4 封筒"
+msgstr "洋形 4 号"
+
+#: ppdc/sample.c:411
msgid "ZPL Label Printer"
-msgstr "ZPL ラベルプリンタ"
+msgstr "ZPL ラベル・プリンター"
+
+#: ppdc/sample.c:334
msgid "Zebra"
-msgstr "Zebra"
+msgstr "ゼブラ"
+
+#: cups/notify.c:102
msgid "aborted"
-msgstr "破棄されました"
+msgstr "停止"
+
+#: cups/notify.c:99
msgid "canceled"
-msgstr "キャンセルされました"
+msgstr "キャンセル"
+
+#: cups/notify.c:105
msgid "completed"
-msgstr "完了しました"
+msgstr "完了"
+
+#: scheduler/cupsfilter.c:335
msgid "convert: Use the -f option to specify a file to convert.\n"
-msgstr "convert:-f オプションを使って、変換するファイルを指定してください。\n"
+msgstr "convert: 変換するファイルを指定するには、-f オプションを使ってください。\n"
+
+#: scheduler/ipp.c:6555
msgid "cups-deviced failed to execute."
msgstr "cups-deviced の実行に失敗しました。"
+
+#: scheduler/ipp.c:7231 scheduler/ipp.c:7481
msgid "cups-driverd failed to execute."
msgstr "cups-driverd の実行に失敗しました。"
+
+#: systemv/cupsaddsmb.c:236
+#, c-format
msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n"
-msgstr "cupsaddsmb:プリンタ“%s”の PPD ファイルがありません - %s\n"
+msgstr "cupsaddsmb: プリンター \"%s\" の PPD ファイルがありません - %s\n"
+
+#: systemv/cupsctl.c:153
+#, c-format
msgid "cupsctl: Unable to connect to server: %s\n"
-msgstr "cupsctl:サーバに接続できません:%s\n"
+msgstr "cupsctl: サーバー: %s に接続できません\n"
+
+#: systemv/cupsctl.c:196
+#, c-format
msgid "cupsctl: Unknown option \"%s\"!\n"
-msgstr "cupsctl:“%s”は不明なオプションです!\n"
+msgstr "cupsctl: \"%s\" は未知のオプションです!\n"
+
+#: systemv/cupsctl.c:198
+#, c-format
msgid "cupsctl: Unknown option \"-%c\"!\n"
-msgstr "cupsctl:“-%c”は不明なオプションです!\n"
+msgstr "cupsctl: \"-%c\"は未知のオプションです!\n"
+
+#: scheduler/main.c:200
msgid "cupsd: Expected config filename after \"-c\" option!\n"
-msgstr "cupsd:“-c”オプションの後に構成ファイル名が必要です!\n"
+msgstr "cupsd: -c オプションのあとには設定ファイル名が必要です!\n"
+
+#: scheduler/main.c:232 scheduler/main.c:239
msgid "cupsd: Unable to get current directory!\n"
-msgstr "cupsd:現在のディレクトリを取得できません!\n"
+msgstr "cupsd: カレント・ディレクトリを取得できません!\n"
+
+#: scheduler/main.c:291
+#, c-format
msgid "cupsd: Unknown argument \"%s\" - aborting!\n"
-msgstr "cupsd:“%s”は不明な引数です - 破棄されます!\n"
+msgstr "cupsd: \"%s\" は未知の引数です - 停止します!\n"
+
+#: scheduler/main.c:284
+#, c-format
msgid "cupsd: Unknown option \"%c\" - aborting!\n"
-msgstr "cupsd:“%c”は不明なオプションです - 破棄されます!\n"
+msgstr "cupsd: \"%c\" は未知のオプションです - 停止します!\n"
+
+#: scheduler/main.c:266
msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
-msgstr "cupsd:launchd(8) サポートがコンパイルされていないため、通常モードで実行します。\n"
+msgstr "cupsd: launchd(8) サポートがコンパイルされていないので、通常モードで動作します。\n"
+
+#: scheduler/cupsfilter.c:1061
+#, c-format
msgid "cupsfilter: Invalid document number %d!\n"
-msgstr "cupsfilter:書類番号 %d が無効です!\n"
+msgstr "cupsfilter: 不正な文書番号 %d です!\n"
+
+#: scheduler/cupsfilter.c:1055
+#, c-format
msgid "cupsfilter: Invalid job ID %d!\n"
-msgstr "cupsfilter:ジョブ ID %d が無効です!\n"
+msgstr "cupsfilter: 不正なジョブID %d です!\n"
+
+#: scheduler/cupsfilter.c:343
msgid "cupsfilter: Only one filename can be specified!\n"
-msgstr "cupsfilter:指定できるファイル名は 1 つだけです!\n"
+msgstr "cupsfilter: ひとつのファイル名のみを指定できます!\n"
+
+#: scheduler/cupsfilter.c:1089
+#, c-format
msgid "cupsfilter: Unable to create temporary file: %s\n"
-msgstr "cupsfilter:一時ファイルを作成できません:%s\n"
+msgstr "cupsfilter: テンポラリー・ファイル: %s を作成できません\n"
+
+#: scheduler/cupsfilter.c:1105
+#, c-format
msgid "cupsfilter: Unable to get job file - %s\n"
-msgstr "cupsfilter:ジョブファイルを取得できません - %s\n"
+msgstr "cupsfilter: ジョブ・ファイルを取得できません - %s\n"
+
+#: systemv/cupstestppd.c:218
msgid "cupstestppd: The -q option is incompatible with the -v option.\n"
-msgstr "cupstestppd:-q オプションは -v オプションと同時には使用できません。\n"
+msgstr "cupstestppd: -q オプションは -v オプションと両立できません。\n"
+
+#: systemv/cupstestppd.c:234
msgid "cupstestppd: The -v option is incompatible with the -q option.\n"
-msgstr "cupstestppd:-v オプションは -q オプションと同時には使用できません。\n"
+msgstr "cupstestppd: -v オプションは -q オプションと両立できません。\n"
+
+#: systemv/lpstat.c:1231 systemv/lpstat.c:1234 systemv/lpstat.c:1237
+#, c-format
msgid "device for %s/%s: %s\n"
-msgstr "%s/%s のデバイス:%s\n"
+msgstr "%s/%s のデバイス: %s\n"
+
+#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224
+#, c-format
msgid "device for %s: %s\n"
-msgstr "%s のデバイス:%s\n"
+msgstr "%s のデバイス: %s\n"
+
+#: cups/snmp.c:1035
msgid "error-index uses indefinite length"
-msgstr "error-index に使われている長さが不定です"
+msgstr "エラー・インデックスは不定長です"
+
+#: cups/snmp.c:1027
msgid "error-status uses indefinite length"
-msgstr "error-status に使われている長さが不定です"
+msgstr "エラー・ステータスは不定長です"
+
+#: cups/notify.c:90
msgid "held"
-msgstr "保留中"
+msgstr "ホールド"
+
+#: berkeley/lpc.c:214
msgid "help\t\tget help on commands\n"
-msgstr "help\t\tコマンドのヘルプを表示します\n"
+msgstr "help\t\tコマンドのヘルプを取得\n"
+
+#: cups/notify.c:131
msgid "idle"
msgstr "待機中"
+
+#: scheduler/ipp.c:8225
msgid "job-printer-uri attribute missing!"
-msgstr "job-printer-uri 属性がありません!"
+msgstr "job-printer-uri 属性がありません!"
+
+#: systemv/lpadmin.c:141 systemv/lpadmin.c:453
msgid "lpadmin: Class name can only contain printable characters!\n"
-msgstr "lpadmin:クラス名に使用できるのはプリント可能な文字だけです!\n"
+msgstr "lpadmin: クラス名は表示可能文字のみで構成されなければなりません!\n"
+
+#: systemv/lpadmin.c:750
msgid "lpadmin: Expected PPD after '-P' option!\n"
-msgstr "lpadmin:‘-P’オプションの後に PPD が必要です!\n"
+msgstr "lpadmin: '-P' オプションのあとに PPD が必要です!\n"
+
+#: systemv/lpadmin.c:491
msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n"
-msgstr "lpadmin:‘-u’オプションの後に allow/deny:userlist が必要です!\n"
+msgstr "lpadmin: '-u' オプションのあとには allow/deny:ユーザリスト が必要です!\n"
+
+#: systemv/lpadmin.c:442
msgid "lpadmin: Expected class after '-r' option!\n"
-msgstr "lpadmin:‘-r’オプションの後にクラスが必要です!\n"
+msgstr "lpadmin: '-r' オプションのあとにはクラス名が必要です!\n"
+
+#: systemv/lpadmin.c:130
msgid "lpadmin: Expected class name after '-c' option!\n"
-msgstr "lpadmin:‘-c’オプションの後にクラス名が必要です!\n"
+msgstr "lpadmin: '-c' オプションのあとにはクラス名が必要です!\n"
+
+#: systemv/lpadmin.c:643
msgid "lpadmin: Expected description after '-D' option!\n"
-msgstr "lpadmin:‘-D’オプションの後に説明が必要です!\n"
+msgstr "lpadmin: '-D' オプションのあとに説明が必要です!\n"
+
+#: systemv/lpadmin.c:550
msgid "lpadmin: Expected device URI after '-v' option!\n"
-msgstr "lpadmin:‘-v’オプションの後にデバイス URI が必要です!\n"
+msgstr "lpadmin: '-v' オプションのあとにはデバイス URI が必要です!\n"
+
+#: systemv/lpadmin.c:659
msgid "lpadmin: Expected file type(s) after '-I' option!\n"
-msgstr "lpadmin:‘-I’オプションの後にファイルタイプが必要です!\n"
+msgstr "lpadmin: '-I' オプションのあとにファイル形式が必要です!\n"
+
+#: systemv/lpadmin.c:212
msgid "lpadmin: Expected hostname after '-h' option!\n"
-msgstr "lpadmin:‘-h’オプションの後にホスト名が必要です!\n"
+msgstr "lpadmin: '-h' オプションのあとにはホスト名が必要です!\n"
+
+#: systemv/lpadmin.c:257
msgid "lpadmin: Expected interface after '-i' option!\n"
-msgstr "lpadmin:‘-i’オプションの後にインターフェイスが必要です!\n"
+msgstr "lpadmin: '-i' オプションのあとにはインターフェイス名が必要です!\n"
+
+#: systemv/lpadmin.c:704
msgid "lpadmin: Expected location after '-L' option!\n"
-msgstr "lpadmin:‘-L’オプションの後に場所が必要です!\n"
+msgstr "lpadmin: '-L' オプションのあとに場所が必要です!\n"
+
+#: systemv/lpadmin.c:338
msgid "lpadmin: Expected model after '-m' option!\n"
-msgstr "lpadmin:‘-m’オプションの後に機種が必要です!\n"
+msgstr "lpadmin: '-m' オプションのあとにはモデル名が必要です!\n"
+
+#: systemv/lpadmin.c:358
msgid "lpadmin: Expected name=value after '-o' option!\n"
-msgstr "lpadmin:‘-o’オプションの後に name=value が必要です!\n"
+msgstr "lpadmin: '-o' オプションのあとには 変数名=値 が必要です!\n"
+
+#: systemv/lpadmin.c:391
msgid "lpadmin: Expected printer after '-p' option!\n"
-msgstr "lpadmin:‘-p’オプションの後にプリンタが必要です!\n"
+msgstr "lpadmin: '-p' オプションのあとにはプリンター名が必要です!\n"
+
+#: systemv/lpadmin.c:174
msgid "lpadmin: Expected printer name after '-d' option!\n"
-msgstr "lpadmin:‘-d’オプションの後にプリンタ名が必要です!\n"
+msgstr "lpadmin: '-d' オプションのあとにはプリンター名が必要です!\n"
+
+#: systemv/lpadmin.c:584
msgid "lpadmin: Expected printer or class after '-x' option!\n"
-msgstr "lpadmin:‘-x’オプションの後にプリンタまたはクラスが必要です!\n"
+msgstr "lpadmin: '-x' オプションのあとにはプリンター名またはクラス名が必要です!\n"
+
+#: systemv/lpadmin.c:1128
msgid "lpadmin: No member names were seen!\n"
-msgstr "lpadmin:メンバー名が見つかりませんでした!\n"
+msgstr "lpadmin: メンバー名が見当たりません!\n"
+
+#: systemv/lpadmin.c:893
+#, c-format
msgid "lpadmin: Printer %s is already a member of class %s.\n"
-msgstr "lpadmin:プリンタ %s はすでにクラス %s のメンバーです。\n"
+msgstr "lpadmin: プリンター %s はすでにクラス %s のメンバーです。\n"
+
+#: systemv/lpadmin.c:1142
+#, c-format
msgid "lpadmin: Printer %s is not a member of class %s.\n"
-msgstr "lpadmin:プリンタ %s はクラス %s のメンバーではありません。\n"
+msgstr "lpadmin: プリンター %s はクラス %s のメンバーではありません。\n"
+
+#: systemv/lpadmin.c:185 systemv/lpadmin.c:402 systemv/lpadmin.c:595
msgid "lpadmin: Printer name can only contain printable characters!\n"
-msgstr "lpadmin:プリンタ名に使用できるのはプリント可能な文字だけです!\n"
-msgid "lpadmin: Unable to add a printer to the class:\n You must specify a printer name first!\n"
-msgstr "lpadmin:クラスにプリンタを追加できません:\n 先にプリンタ名を指定する必要があります!\n"
+msgstr "lpadmin: プリンター名には印字可能な文字のみ使用できます!\n"
+
+#: systemv/lpadmin.c:115
+msgid ""
+"lpadmin: Unable to add a printer to the class:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: クラスにプリンターを追加できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:106 systemv/lpadmin.c:159 systemv/lpadmin.c:230
+#: systemv/lpadmin.c:291 systemv/lpadmin.c:310 systemv/lpadmin.c:376
+#: systemv/lpadmin.c:417 systemv/lpadmin.c:523 systemv/lpadmin.c:569
+#: systemv/lpadmin.c:615 systemv/lpadmin.c:677 systemv/lpadmin.c:723
+#: systemv/lpadmin.c:784
+#, c-format
msgid "lpadmin: Unable to connect to server: %s\n"
-msgstr "lpadmin:サーバに接続できません:%s\n"
+msgstr "lpadmin: サーバーに接続できません: %s\n"
+
+#: systemv/lpadmin.c:1845
+#, c-format
msgid "lpadmin: Unable to create temporary file - %s\n"
-msgstr "lpadmin:一時ファイルを作成できません - %s\n"
+msgstr "lpadmin: テンポラリファイルを作成できません - %s\n"
+
+#: systemv/lpadmin.c:1454
+#, c-format
msgid "lpadmin: Unable to create temporary file: %s\n"
-msgstr "lpadmin:一時ファイルを作成できません:%s\n"
+msgstr "lpadmin: テンポラリファイルを作成できません: %s\n"
+
+#: systemv/lpadmin.c:1855
+#, c-format
msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n"
-msgstr "lpadmin:PPD ファイル“%s”を開けません - %s\n"
+msgstr "lpadmin: PPD ファイル \"%s\" を開けません - %s\n"
+
+#: systemv/lpadmin.c:1462
+#, c-format
msgid "lpadmin: Unable to open file \"%s\": %s\n"
-msgstr "lpadmin:ファイル“%s”を開けません:%s\n"
-msgid "lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first!\n"
-msgstr "lpadmin:クラスからプリンタを取り除けません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the PPD file:\n You must specify a printer name first!\n"
-msgstr "lpadmin:PPD ファイルを設定できません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the device URI:\n You must specify a printer name first!\n"
-msgstr "lpadmin:デバイス URI を設定できません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the interface script or PPD file:\n You must specify a printer name first!\n"
-msgstr "lpadmin:インターフェイス・スクリプトまたは PPD ファイルを設定できません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the interface script:\n You must specify a printer name first!\n"
-msgstr "lpadmin:インターフェイス・スクリプトを設定できません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the printer description:\n You must specify a printer name first!\n"
-msgstr "lpadmin:プリンタの説明を設定できません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the printer location:\n You must specify a printer name first!\n"
-msgstr "lpadmin:プリンタの場所を設定できません:\n 先にプリンタ名を指定する必要があります!\n"
-msgid "lpadmin: Unable to set the printer options:\n You must specify a printer name first!\n"
-msgstr "lpadmin:プリンタオプションを設定できません:\n 先にプリンタ名を指定する必要があります!\n"
+msgstr "lpadmin: ファイル \"%s\" を開けません: %s\n"
+
+#: systemv/lpadmin.c:426
+msgid ""
+"lpadmin: Unable to remove a printer from the class:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: クラスからプリンターを削除できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:732
+msgid ""
+"lpadmin: Unable to set the PPD file:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: PPD ファイルを設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:532
+msgid ""
+"lpadmin: Unable to set the device URI:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: デバイス URI を設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:319
+msgid ""
+"lpadmin: Unable to set the interface script or PPD file:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: インターフェイス・スクリプトまたは PPD ファイルを設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:239
+msgid ""
+"lpadmin: Unable to set the interface script:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: インターフェイススクリプトを設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:624
+msgid ""
+"lpadmin: Unable to set the printer description:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: プリンターの説明を設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:686
+msgid ""
+"lpadmin: Unable to set the printer location:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: プリンターの場所が設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:793
+msgid ""
+"lpadmin: Unable to set the printer options:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: プリンター・オプションを設定できません:\n"
+" 先にプリンター名を指定する必要があります!\n"
+
+#: systemv/lpadmin.c:508
+#, c-format
msgid "lpadmin: Unknown allow/deny option \"%s\"!\n"
-msgstr "lpadmin:“%s”は不明な許可/拒否オプションです!\n"
+msgstr "lpadmin:\"%s\" は未知の allow/deny オプションです!\n"
+
+#: systemv/lpadmin.c:766
+#, c-format
msgid "lpadmin: Unknown argument '%s'!\n"
-msgstr "lpadmin:‘%s’は不明な引数です!\n"
+msgstr "lpadmin: '%s' は未知の引数です!\n"
+
+#: systemv/lpadmin.c:761
+#, c-format
msgid "lpadmin: Unknown option '%c'!\n"
-msgstr "lpadmin:‘%c’は不明なオプションです!\n"
+msgstr "lpadmin: '%c' は未知のオプションです!\n"
+
+#: systemv/lpadmin.c:665
msgid "lpadmin: Warning - content type list ignored!\n"
-msgstr "lpadmin:警告 - コンテンツ・タイプ・リストは無視されました!\n"
+msgstr "lpadmin: 警告 - コンテンツタイプリストは無視されます!\n"
+
+#: berkeley/lpc.c:81 berkeley/lpc.c:109 berkeley/lpc.c:145
msgid "lpc> "
msgstr "lpc> "
+
+#: systemv/lpinfo.c:143
msgid "lpinfo: Expected 1284 device ID string after --device-id!\n"
-msgstr "lpinfo:--device-id の後に 1284 デバイス ID 文字列が必要です!\n"
+msgstr "lpinfo: --device-id の後には、1284デバイスIDを指定する必要があります!\n"
+
+#: systemv/lpinfo.c:196
msgid "lpinfo: Expected language after --language!\n"
-msgstr "lpinfo:--language の後に言語が必要です!\n"
+msgstr "lpinfo: --language の後には、言語を指定する必要があります!\n"
+
+#: systemv/lpinfo.c:213
msgid "lpinfo: Expected make and model after --make-and-model!\n"
-msgstr "lpinfo:--make-and-model の後に製造元と機種が必要です!\n"
+msgstr "lpinfo: --make-and-model の後には、メーカーとモデルを指定する必要があります!\n"
+
+#: systemv/lpinfo.c:230
msgid "lpinfo: Expected product string after --product!\n"
-msgstr "lpinfo:--product の後に製品文字列が必要です!\n"
+msgstr "lpinfo: --product の後には、製品名を指定する必要があります!\n"
+
+#: systemv/lpinfo.c:161
msgid "lpinfo: Expected scheme list after --exclude-schemes!\n"
-msgstr "lpinfo:--exclude-schemes の後にスキームリストが必要です!\n"
+msgstr "lpinfo: --exclude-schemes の後には、スキーマ・リストを指定する必要があります!\n"
+
+#: systemv/lpinfo.c:179
msgid "lpinfo: Expected scheme list after --include-schemes!\n"
-msgstr "lpinfo:--include-schemes の後にスキームリストが必要です!\n"
+msgstr "lpinfo: --include-schemes の後には、スキーマ・リストを指定する必要があります!\n"
+
+#: systemv/lpinfo.c:247
msgid "lpinfo: Expected timeout after --timeout!\n"
-msgstr "lpinfo:--timeout の後にタイムアウトが必要です!\n"
+msgstr "lpinfo: --timeout の後には、タイムアウト値を指定する必要があります!\n"
+
+#: systemv/lpinfo.c:270
+#, c-format
msgid "lpinfo: Unknown argument '%s'!\n"
-msgstr "lpinfo:‘%s’は不明な引数です!\n"
+msgstr "lpinfo: 未知の引数 '%s'!\n"
+
+#: systemv/lpinfo.c:264
+#, c-format
msgid "lpinfo: Unknown option '%c'!\n"
-msgstr "lpinfo:‘%c’は不明なオプションです!\n"
+msgstr "lpinfo: 未知のオプション '%c'!\n"
+
+#: systemv/lpinfo.c:257
+#, c-format
msgid "lpinfo: Unknown option '%s'!\n"
-msgstr "lpinfo:‘%s’は不明なオプションです!\n"
+msgstr "lpinfo: 未知のオプション '%s'!\n"
+
+#: systemv/lpmove.c:141
+#, c-format
msgid "lpmove: Unable to connect to server: %s\n"
-msgstr "lpmove:サーバに接続できません:%s\n"
+msgstr "lpmove: サーバーに接続できません: %s!\n"
+
+#: systemv/lpmove.c:125
+#, c-format
msgid "lpmove: Unknown argument '%s'!\n"
-msgstr "lpmove:‘%s’は不明な引数です!\n"
+msgstr "lpmove: 未知の引数 '%s'!\n"
+
+#: systemv/lpmove.c:103
+#, c-format
msgid "lpmove: Unknown option '%c'!\n"
-msgstr "lpmove:‘%c’は不明なオプションです!\n"
+msgstr "lpmove: 未知のオプション '%c'!\n"
+
+#: systemv/lpoptions.c:154 systemv/lpoptions.c:172 systemv/lpoptions.c:248
msgid "lpoptions: No printers!?!\n"
-msgstr "lpoptions:プリンタがありません!?!\n"
+msgstr "lpoptions: プリンターがありません!?!\n"
+
+#: systemv/lpoptions.c:223
+#, c-format
msgid "lpoptions: Unable to add printer or instance: %s\n"
-msgstr "lpoptions:プリンタまたはインスタンスを追加できません:%s\n"
+msgstr "lpoptions: プリンターまたはインスタンスを追加できません: %s\n"
+
+#: systemv/lpoptions.c:507
+#, c-format
msgid "lpoptions: Unable to get PPD file for %s: %s\n"
-msgstr "lpoptions:%s の PPD ファイルを取得できません:%s\n"
+msgstr "lpoptions: %s の PPD ファイルを開けません!: %s\n"
+
+#: systemv/lpoptions.c:516
+#, c-format
msgid "lpoptions: Unable to open PPD file for %s!\n"
-msgstr "lpoptions:%s の PPD ファイルを開けません!n"
+msgstr "lpoptions: %s の PPD ファイルを開けません!\n"
+
+#: systemv/lpoptions.c:104
msgid "lpoptions: Unknown printer or class!\n"
-msgstr "lpoptions:プリンタまたはクラスが不明です!\n"
+msgstr "lpoptions: 未知のプリンターまたはクラスです!\n"
+
+#: systemv/lppasswd.c:185
msgid "lppasswd: Only root can add or delete passwords!\n"
-msgstr "lppasswd:パスワードを追加または削除できるのはルートだけです!\n"
+msgstr "lppasswd: root だけがパスワードの追加と削除を行えます!\n"
+
+#: systemv/lppasswd.c:314
msgid "lppasswd: Password file busy!\n"
-msgstr "lppasswd:パスワードファイルがビジー状態です!\n"
+msgstr "lppasswd: パスワードファイルがビジー状態です!\n"
+
+#: systemv/lppasswd.c:447
msgid "lppasswd: Password file not updated!\n"
-msgstr "lppasswd:パスワードファイルはアップデートされませんでした!\n"
+msgstr "lppasswd: パスワードファイルは更新されません!\n"
+
+#: systemv/lppasswd.c:414
msgid "lppasswd: Sorry, password doesn't match!\n"
-msgstr "lppasswd:パスワードが一致しません!\n"
-msgid "lppasswd: Sorry, password rejected.\nYour password must be at least 6 characters long, cannot contain\nyour username, and must contain at least one letter and number.\n"
-msgstr "lppasswd:パスワードが拒否されました。\nパスワードの長さは 6 文字以上でなければならず、ユーザ名を含めることは\nできず、英字と数字をそれぞれ 1 文字以上含める必要があります。\n"
+msgstr "lppasswd: すみませんが、パスワードがマッチしません!\n"
+
+#: systemv/lppasswd.c:264
+msgid ""
+"lppasswd: Sorry, password rejected.\n"
+"Your password must be at least 6 characters long, cannot contain\n"
+"your username, and must contain at least one letter and number.\n"
+msgstr ""
+"lppasswd: すみませんが、パスワードは拒否されました。\n"
+"パスワードは少なくとも 6 文字以上で、あなたのユーザー名を含んではならず、\n"
+"少なくとも 1 つの英字および数値を含んでなければなりません。\n"
+
+#: systemv/lppasswd.c:240
msgid "lppasswd: Sorry, passwords don't match!\n"
-msgstr "lppasswd:パスワードが一致しません!\n"
+msgstr "lppasswd: すみませんが、パスワードがマッチしません!\n"
+
+#: systemv/lppasswd.c:211 systemv/lppasswd.c:229
+#, c-format
msgid "lppasswd: Unable to copy password string: %s\n"
-msgstr "lppasswd:パスワード文字列をコピーできません:%s\n"
+msgstr "lppasswd: パスワード文字列をコピーできません: %s\n"
+
+#: systemv/lppasswd.c:317 systemv/lppasswd.c:326 systemv/lppasswd.c:344
+#, c-format
msgid "lppasswd: Unable to open password file: %s\n"
-msgstr "lppasswd:パスワードファイルを開けません:%s\n"
+msgstr "lppasswd: パスワードファイルを開けません: %s\n"
+
+#: systemv/lppasswd.c:379 systemv/lppasswd.c:392 systemv/lppasswd.c:424
+#, c-format
msgid "lppasswd: Unable to write to password file: %s\n"
-msgstr "lppasswd:パスワードファイルに書き込めません:%s\n"
+msgstr "lppasswd: パスワードファイルに書き込めません: %s\n"
+
+#: systemv/lppasswd.c:462
+#, c-format
msgid "lppasswd: failed to backup old password file: %s\n"
-msgstr "lppasswd:古いパスワードファイルのバックアップ作成に失敗しました:%s\n"
+msgstr "lppasswd: 古いパスワードファイルのバックアップに失敗しました: %s\n"
+
+#: systemv/lppasswd.c:475
+#, c-format
msgid "lppasswd: failed to rename password file: %s\n"
-msgstr "lppasswd:パスワードファイルの名称変更に失敗しました:%s\n"
+msgstr "lppasswd: パスワードファイルの名前の変更に失敗しました: %s\n"
+
+#: systemv/lppasswd.c:404
+#, c-format
msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
-msgstr "lppasswd:ユーザ“%s”とグループ“%s”が存在しません。\n"
+msgstr "lppasswd: ユーザー \"%s\" およびグループ \"%s\" は存在しません。\n"
+
+#: systemv/lpstat.c:1039
+#, c-format
msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr "lpstat:エラー - %s 環境変数に存在しない送信先“%s”が指定されています!\n"
+msgstr "lpstat: エラー - 環境変数 %s が、存在しない宛先 \"%s\" を指しています!\n"
+
+#: systemv/lpstat.c:969
+#, c-format
msgid "members of class %s:\n"
-msgstr "クラス %s のメンバー:\n"
+msgstr "クラス %s のメンバー:\n"
+
+#: berkeley/lpq.c:575
msgid "no entries\n"
msgstr "エントリーがありません\n"
+
+#: systemv/lpstat.c:1043
msgid "no system default destination\n"
-msgstr "システムのデフォルトの送信先がありません\n"
+msgstr "システムのデフォルトの宛先がありません\n"
+
+#: scheduler/ipp.c:6249
msgid "notify-events not specified!"
-msgstr "notify-events が指定されていません!"
+msgstr "notify-events が指定されていません!"
+
+#: scheduler/ipp.c:2102 scheduler/ipp.c:6154
+#, c-format
msgid "notify-recipient-uri URI \"%s\" is already used!"
-msgstr "notify-recipient-uri の URI“%s”はすでに使用されています!"
+msgstr "notify-recipient-uri URI \"%s\" はすでに使われています!"
+
+#: scheduler/ipp.c:2092 scheduler/ipp.c:6144
+#, c-format
msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!"
-msgstr "notify-recipient-uri の URI“%s”に不明なスキームが使用されています!"
+msgstr "notify-recipient-uri URI \"%s\" には未知のスキームが使われています!"
+
+#: scheduler/ipp.c:4136 scheduler/ipp.c:7079 scheduler/ipp.c:7780
+#: scheduler/ipp.c:9269
+#, c-format
msgid "notify-subscription-id %d no good!"
-msgstr "notify-subscription-id %d が正しくありません!"
+msgstr "notify-subscription-id %d は良くありません!"
+
+#: cups/notify.c:87
msgid "pending"
-msgstr "保留中"
+msgstr "保留"
+
+#: ppdc/ppdc.cxx:108 ppdc/ppdpo.cxx:94
+#, c-format
msgid "ppdc: Adding include directory \"%s\"...\n"
-msgstr "ppdc:インクルードディレクトリ“%s”を追加中...\n"
+msgstr "ppdc: ディレクトリー \"%s\" を追加しています...\n"
+
+#: ppdc/ppdpo.cxx:136
+#, c-format
msgid "ppdc: Adding/updating UI text from %s...\n"
-msgstr "ppdc:%s から UI テキストを追加/アップデート中...\n"
+msgstr "ppdc: %s から UI テキストを追加または更新しています...\n"
+
+#: ppdc/ppdc-source.cxx:375
+#, c-format
msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n"
-msgstr "ppdc:%3$s の %2$d 行目の論理値(%1$s)が正しくありません。\n"
+msgstr "ppdc: 不正な boolean 値 (%s) があります。%d 行目、ファイル名 %s。\n"
+
+#: ppdc/ppdc-source.cxx:1750
+#, c-format
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の解像度名“%1$s”が正しくありません!\n"
+msgstr "ppdc: 不正な resolution 名 \"%s\" があります。%d 行目、ファイル名 %s !\n"
+
+#: ppdc/ppdc-source.cxx:1078
+#, c-format
msgid "ppdc: Bad status keyword %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の状況キーワード %1$s が正しくありません!\n"
+msgstr "ppdc: 不正な status キーワード %s があります。%d 行目、ファイル名 %s !\n"
+
+#: ppdc/ppdc-source.cxx:1987
+#, c-format
msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n"
-msgstr "ppdc:%3$s の %2$d 行目の変数代入($%1$c)が正しくありません。\n"
+msgstr "ppdc: 不正な数値置換 ($%c) があります。%d 行目、ファイル名 %s。\n"
+
+#: ppdc/ppdc-source.cxx:2657
+#, c-format
msgid "ppdc: Choice found on line %d of %s with no Option!\n"
-msgstr "ppdc:%2$s の %1$d 行目にオプションのない選択が見つかりました!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s で、Option がないのに Choice が見つかりました!\n"
+
+#: ppdc/ppdc-source.cxx:1654
+#, c-format
msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目のロケール %1$s の #po が重複しています!\n"
+msgstr "ppdc: locale %s に対して #po が2重に定義されています。%d 行目、ファイル名 %s !\n"
+
+#: ppdc/ppdc-source.cxx:897
+#, c-format
msgid "ppdc: Expected a filter definition on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にフィルタ定義が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s においてフィルター定義が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:920
+#, c-format
msgid "ppdc: Expected a program name on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にプログラム名が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s においてプログラム名が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:359
+#, c-format
msgid "ppdc: Expected boolean value on line %d of %s.\n"
-msgstr "ppdc:%2$s の %1$d 行目に論理値が必要です。\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において boolean 値が必要です。\n"
+
+#: ppdc/ppdc-source.cxx:1058
+#, c-format
msgid "ppdc: Expected charset after Font on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Font の後に文字セットが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に charset が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:412
+#, c-format
msgid "ppdc: Expected choice code on line %d of %s.\n"
-msgstr "ppdc:%2$s の %1$d 行目に選択コードが必要です。\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において choice code が必要です。\n"
+
+#: ppdc/ppdc-source.cxx:400
+#, c-format
msgid "ppdc: Expected choice name/text on line %d of %s.\n"
-msgstr "ppdc:%2$s の %1$d 行目に選択名/テキストが必要です。\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において choice name/text が必要です。\n"
+
+#: ppdc/ppdc-source.cxx:468
+#, c-format
msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に ColorModel の色順序が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する color order が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:457
+#, c-format
msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に ColorModel の色空間が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する colorspace が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:479
+#, c-format
msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に ColorModel の圧縮が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する compression が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:660
+#, c-format
msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に UIConstraints の制約文字列が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において UIConstraints に対する constraint が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:2834
+#, c-format
msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の DriverType の後にドライバ・タイプ・キーワードが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において DriverType の後に driver type keyword が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:791
+#, c-format
msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目び Duplex の後に両面タイプが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Duplex の後に type が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1042
+#, c-format
msgid "ppdc: Expected encoding after Font on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Font の後にエンコーディングが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に encoding が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1645
+#, c-format
msgid "ppdc: Expected filename after #po %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の #po %1$s の後にファイル名が必要です!\n"
+msgstr "ppdc: #po %s の後にファイル名が必要です! (%d 行目, ファイル %s)\n"
+
+#: ppdc/ppdc-source.cxx:1170
+#, c-format
msgid "ppdc: Expected group name/text on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にグループ名/テキストが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において group name/text が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:2557
+#, c-format
msgid "ppdc: Expected include filename on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にインクルードファイル名が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において include ファイル名が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1466
+#, c-format
msgid "ppdc: Expected integer on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に整数が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において整数指定が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1637
+#, c-format
msgid "ppdc: Expected locale after #po on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の #po の後にロケールが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において #po の後に locale が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:318
+#, c-format
msgid "ppdc: Expected name after %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の %1$s の後に名前が必要です!\n"
+msgstr "ppdc: %s の後に name が必要です。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:3178
+#, c-format
msgid "ppdc: Expected name after FileName on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の FileName の後に名前が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において FileName の後に name が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1023
+#, c-format
msgid "ppdc: Expected name after Font on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Font の後に名前が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に name が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:3018
+#, c-format
msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Manufacturer の後に名前が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Manufacturer の後に name が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:3051
+#, c-format
msgid "ppdc: Expected name after MediaSize on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の MediaSize の後に名前が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において MediaSize の後に name が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:3132
+#, c-format
msgid "ppdc: Expected name after ModelName on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の ModelName の後に名前が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において ModelName の後に name が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:3195
+#, c-format
msgid "ppdc: Expected name after PCFileName on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の PCFileName の後に名前が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において PCFileName の後に name が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1121
+#, c-format
msgid "ppdc: Expected name/text after %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の %1$s の後に名前/テキストが必要です!\n"
+msgstr "ppdc: %s の後に name/text が必要です。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:1210
+#, c-format
msgid "ppdc: Expected name/text after Installable on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Installable の後に名前/テキストが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Installable の後に name/text が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1736
+#, c-format
msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Resolution の後に名前/テキストが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Resolution の後に name/text が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:444
+#, c-format
msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の ColorModel に名前/テキストの組み合わせが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する name/text が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1537
+#, c-format
msgid "ppdc: Expected option name/text on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にオプション名/テキストが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において option name/text が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1571
+#, c-format
msgid "ppdc: Expected option section on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にオプションセクションが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において option section が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1549
+#, c-format
msgid "ppdc: Expected option type on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目にオプションタイプが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において option type が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1719
+#, c-format
msgid "ppdc: Expected override field after Resolution on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Resolution の後にオーバーライドフィールドが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Resolution の後に override field が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:969
+#, c-format
msgid "ppdc: Expected real number on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に実数が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において実数が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:537
+#, c-format
msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の ColorProfile の後に解像度/メディアタイプが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において ColorProfile に続いて resolution/mediatype が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:1817
+#, c-format
msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の SimpleColorProfile の後に解像度/メディアタイプが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において SimpleColorProfile に続いて resolution/mediatype が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:326
+#, c-format
msgid "ppdc: Expected selector after %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の %1$s の後にセレクタが必要です!\n"
+msgstr "ppdc: %s の後に selector が必要です。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:1066
+#, c-format
msgid "ppdc: Expected status after Font on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Font の後に状況が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に status が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:2732
+#, c-format
msgid "ppdc: Expected string after Copyright on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Copyright の後に文字列が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Copyright の後に文字列が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:3289
+#, c-format
msgid "ppdc: Expected string after Version on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Version の後に文字列が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Version の後に文字列が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:693
+#, c-format
msgid "ppdc: Expected two option names on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に 2 つのオプション名が必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において 2 つのオプション名が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:337
+#, c-format
msgid "ppdc: Expected value after %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の %1$s の後に値が必要です!\n"
+msgstr "ppdc: %s の後に value が必要です。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:1050
+#, c-format
msgid "ppdc: Expected version after Font on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目の Font の後にバージョンが必要です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に version が必要です!\n"
+
+#: ppdc/ppdc-source.cxx:192
+#, c-format
msgid "ppdc: Invalid #include/#po filename \"%s\"!\n"
-msgstr "ppdc:#include/#po ファイル名“%s”が無効です!\n"
+msgstr "ppdc: 無効な #include/#po ファイル名です \"%s\"!\n"
+
+#: ppdc/ppdc-source.cxx:937
+#, c-format
msgid "ppdc: Invalid cost for filter on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目のフィルタのコストが無効です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な cost があります!\n"
+
+#: ppdc/ppdc-source.cxx:929
+#, c-format
msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目のフィルタの MIME タイプが空であるのは無効です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の MIME type があります!\n"
+
+#: ppdc/ppdc-source.cxx:945
+#, c-format
msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目のフィルタのプログラム名が空であるのは無効です!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の program name があります!\n"
+
+#: ppdc/ppdc-source.cxx:1591
+#, c-format
msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目のオプションセクション“%1$s”が無効です!\n"
+msgstr "ppdc: 無効な option section があります \"%s\"。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:1563
+#, c-format
msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目のオプションタイプ“%1$s”が無効です!\n"
+msgstr "ppdc: 無効な option type があります \"%s\"。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc.cxx:244 ppdc/ppdpo.cxx:124
+#, c-format
msgid "ppdc: Loading driver information file \"%s\"...\n"
-msgstr "ppdc:ドライバ情報ファイル“%s”を読み込み中...\n"
+msgstr "ppdc: ドライバー情報ファイル \"%s\" を読み込んでいます...\n"
+
+#: ppdc/ppdc.cxx:180
+#, c-format
msgid "ppdc: Loading messages for locale \"%s\"...\n"
-msgstr "ppdc:ロケール“%s”のメッセージを読み込み中...\n"
+msgstr "ppdc: ロケール \"%s\" のメッセージを読み込んでいます...\n"
+
+#: ppdc/ppdc.cxx:121
+#, c-format
msgid "ppdc: Loading messages from \"%s\"...\n"
-msgstr "ppdc:“%s”からメッセージを読み込み中...\n"
+msgstr "ppdc: \"%s\" からメッセージを読み込んでいます...\n"
+
+#: ppdc/ppdc-source.cxx:2354 ppdc/ppdc-source.cxx:2582
+#, c-format
msgid "ppdc: Missing #endif at end of \"%s\"!\n"
-msgstr "ppdc:“%s”の最後に #endif がありません!\n"
+msgstr "ppdc: \"%s\" の最後に #endif が見つかりません!\n"
+
+#: ppdc/ppdc-source.cxx:2451 ppdc/ppdc-source.cxx:2486
+#: ppdc/ppdc-source.cxx:2516
+#, c-format
msgid "ppdc: Missing #if on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に #if がありません!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において #if が見つかりません!\n"
+
+#: ppdc/ppdc-driver.cxx:683
+#, c-format
msgid "ppdc: No message catalog provided for locale %s!\n"
-msgstr "ppdc:ロケール %s にメッセージカタログが渡されていません!\n"
+msgstr "ppdc: ロケール %s に対するメッセージカタログが見つかりません!\n"
+
+#: ppdc/ppdc-source.cxx:1607
+#, c-format
msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n"
-msgstr "ppdc:オプション %1$s は %3$s の %2$d 行目で別のタイプで再定義されています!\n"
+msgstr "ppdc: オプション %s は異なる型で再定義されています。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:670
+#, c-format
msgid "ppdc: Option constraint must *name on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目のオプション制約は *name である必要があります!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において Option constraint は *name で指定します!\n"
+
+#: ppdc/ppdc-source.cxx:2433
+#, c-format
msgid "ppdc: Too many nested #if's on line %d of %s!\n"
-msgstr "ppdc:%2$s の %1$d 行目に #if の入れ子が多すぎます!\n"
+msgstr "ppdc: %d 行目、ファイル名 %s において #if のネストが多すぎます!\n"
+
+#: ppdc/ppdc.cxx:348
+#, c-format
msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n"
-msgstr "ppdc:PPD ファイル“%s”を作成できません - %s。\n"
+msgstr "ppdc: PPD ファイル \"%s\" を作成できません - %s。\n"
+
+#: ppdc/ppdc.cxx:259
+#, c-format
msgid "ppdc: Unable to create output directory %s: %s\n"
-msgstr "ppdc:出力ディレクトリ %s を作成できません:%s\n"
+msgstr "ppdc: ディレクトリー \"%s\" を作成できません - %s\n"
+
+#: ppdc/ppdc.cxx:280
+#, c-format
msgid "ppdc: Unable to create output pipes: %s\n"
-msgstr "ppdc:出力パイプを作成できません:%s\n"
+msgstr "ppdc: 出力 pipe が作成できません: %s\n"
+
+#: ppdc/ppdc.cxx:297 ppdc/ppdc.cxx:304
+#, c-format
msgid "ppdc: Unable to execute cupstestppd: %s\n"
-msgstr "ppdc:cupstestppd を実行できません:%s\n"
+msgstr "ppdc: cupstestppd を実行できません: %s\n"
+
+#: ppdc/ppdc-source.cxx:1684
+#, c-format
msgid "ppdc: Unable to find #po file %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目に #po ファイル %1$s が見つかりません!\n"
+msgstr "ppdc: #po ファイル %s が見つかりません。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:2589
+#, c-format
msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目にインクルードファイル“%1$s”が見つかりません!\n"
+msgstr "ppdc: インクルードファイル %s が見つかりません。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc.cxx:191
+#, c-format
msgid "ppdc: Unable to find localization for \"%s\" - %s\n"
-msgstr "ppdc:“%s”のローカリゼーションが見つかりません - %s\n"
+msgstr "ppdc: \"%s\" に対する地域化情報が見つかりません - %s \n"
+
+#: ppdc/ppdc.cxx:130
+#, c-format
msgid "ppdc: Unable to load localization file \"%s\" - %s\n"
-msgstr "ppdc:ローカリゼーションファイル“%s”を読み込めません - %s\n"
+msgstr "ppdc: \"%s\" に対する地域化情報を読み込めません - %s \n"
+
+#: ppdc/ppdc-source.cxx:2007
+#, c-format
msgid "ppdc: Undefined variable (%s) on line %d of %s.\n"
-msgstr "ppdc:%3$s の %2$d 行目の変数(%1$s)が未定義です。\n"
+msgstr "ppdc: 変数 (%s) は未定義です。%d 行目、ファイル名 %s。\n"
+
+#: ppdc/ppdc-source.cxx:2853
+#, c-format
msgid "ppdc: Unknown driver type %s on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目のドライバタイプ %1$s が不明です!\n"
+msgstr "ppdc: %s は未知のドライバータイプです。%d 行目、ファイル名 %s。\n"
+
+#: ppdc/ppdc-source.cxx:871
+#, c-format
msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の両面タイプ“%1$s”が不明です!\n"
+msgstr "ppdc: \"%s\" は未知の両面タイプです。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:3064
+#, c-format
msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目のメディアサイズ“%1$s”が不明です!\n"
+msgstr "ppdc: \"%s\" は未知の用紙サイズです。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:3300
+#, c-format
msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目のトークン“%1$s”が不明です!\n"
+msgstr "ppdc: 未知の token \"%s\" があります。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:979
+#, c-format
msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の実数“%1$s”の後続文字列が不明です!\n"
+msgstr "ppdc: 実数に未知の終了文字 \"%s\" があります。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc-source.cxx:2116
+#, c-format
msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n"
-msgstr "ppdc:%3$s の %2$d 行目の %1$c で始まる文字列が終了していません!\n"
+msgstr "ppdc: %c で始まる文字に対して終端文字がありません。%d 行目、ファイル名 %s!\n"
+
+#: ppdc/ppdc.cxx:354
+#, c-format
msgid "ppdc: Writing %s...\n"
-msgstr "ppdc:%s を書き込み中...\n"
+msgstr "ppdc: %s を書き込んでいます...\n"
+
+#: ppdc/ppdc.cxx:143
+#, c-format
msgid "ppdc: Writing PPD files to directory \"%s\"...\n"
-msgstr "ppdc:ディレクトリ“%s”に PPD ファイルを書き込み中...\n"
+msgstr "ppdc: ディレクトリー \"%s\" に PPD ファイルを書き込んでいます...\n"
+
+#: ppdc/ppdmerge.cxx:138
+#, c-format
msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n"
-msgstr "ppdmerge:%2$s の LanguageVersion“%1$s”が正しくありません!\n"
+msgstr "ppdmerge: 不正な LanguageVersion \"%s\" が %s にあります!\n"
+
+#: ppdc/ppdmerge.cxx:178
+#, c-format
msgid "ppdmerge: Ignoring PPD file %s...\n"
-msgstr "ppdmerge:PPD ファイル %s は無視されます...\n"
+msgstr "ppdmerge: PPD ファイル %s を無視します...\n"
+
+#: ppdc/ppdmerge.cxx:162
+#, c-format
msgid "ppdmerge: Unable to backup %s to %s- %s\n"
-msgstr "ppdmerge:%s のバックアップを %s に作成できません - %s\n"
+msgstr "ppdmerge: %s を %s にバックアップできません - %s\n"
+
+#: systemv/lpstat.c:1769
+#, c-format
msgid "printer %s disabled since %s -\n"
-msgstr "プリンタ %s は %s 以来無効になっています -\n"
+msgstr "プリンター %s は %s から無効です -\n"
+
+#: systemv/lpstat.c:1758
+#, c-format
msgid "printer %s is idle. enabled since %s\n"
-msgstr "プリンタ %s は待機中です。%s 以来有効になっています\n"
+msgstr "プリンター %s は待機中です。%s 以来有効です\n"
+
+#: systemv/lpstat.c:1763
+#, c-format
msgid "printer %s now printing %s-%d. enabled since %s\n"
-msgstr "プリンタ %s は現在 %s-%d をプリント中です。%s 以来有効になっています\n"
+msgstr "プリンター %s は %s-%d を印刷しています。%s 以来有効です\n"
+
+#: systemv/lpstat.c:1881
+#, c-format
msgid "printer %s/%s disabled since %s -\n"
-msgstr "プリンタ %s/%s は %s 以来無効になっています -\n"
+msgstr "プリンター %s/%s は %s から無効です -\n"
+
+#: systemv/lpstat.c:1867
+#, c-format
msgid "printer %s/%s is idle. enabled since %s\n"
-msgstr "プリンタ %s/%s は待機中です。%s 以来有効になっています\n"
+msgstr "プリンター %s/%s は待機中です。%s 以来有効です\n"
+
+#: systemv/lpstat.c:1874
+#, c-format
msgid "printer %s/%s now printing %s-%d. enabled since %s\n"
-msgstr "プリンタ %s/%s は現在 %s-%d をプリント中です。%s 以来有効になっています\n"
+msgstr "プリンター %s/%s は現在 %s-%d を印刷中です。%s 以来有効です\n"
+
+#: cups/notify.c:93 cups/notify.c:134
msgid "processing"
msgstr "処理中"
+
+#: systemv/lp.c:660
+#, c-format
msgid "request id is %s-%d (%d file(s))\n"
-msgstr "要求 ID は %s-%d です(%d 個のファイル)\n"
+msgstr "リクエスト ID は %s-%d です (%d 個のファイル)\n"
+
+#: cups/snmp.c:1019
msgid "request-id uses indefinite length"
-msgstr "request-id に使われている長さが不定です"
+msgstr "リクエスト ID の長さが不定"
+
+#: systemv/lpstat.c:2008
msgid "scheduler is not running\n"
-msgstr "スケジューラは実行されていません\n"
+msgstr "スケジューラーは動作していません\n"
+
+#: systemv/lpstat.c:2004
msgid "scheduler is running\n"
-msgstr "スケジューラは実行中です\n"
+msgstr "スケジューラーは動作中です\n"
+
+#: cups/adminutil.c:2261
+#, c-format
msgid "stat of %s failed: %s"
-msgstr "%s の統計情報を取得できませんでした:%s"
+msgstr "%s の状態取得に失敗しました: %s"
+
+#: berkeley/lpc.c:216
msgid "status\t\tshow status of daemon and queue\n"
-msgstr "status\t\tデーモンとキューの状況を表示します\n"
+msgstr "status\t\tデーモンとキューの状態を表示\n"
+
+#: cups/notify.c:96 cups/notify.c:137
msgid "stopped"
-msgstr "停止中"
+msgstr "停止"
+
+#: systemv/lpstat.c:1017
+#, c-format
msgid "system default destination: %s\n"
-msgstr "システムのデフォルトの送信先:%s\n"
+msgstr "システムのデフォルトの宛先: %s\n"
+
+#: systemv/lpstat.c:1014
+#, c-format
msgid "system default destination: %s/%s\n"
-msgstr "システムのデフォルトの送信先:%s/%s\n"
+msgstr "システムのデフォルトの宛先: %s/%s\n"
+
+#: cups/notify.c:108 cups/notify.c:140
msgid "unknown"
-msgstr "不明"
+msgstr "未知"
+
+#: cups/notify.c:117
msgid "untitled"
-msgstr "名称未設定"
+msgstr "タイトルなし"
+
+#: cups/snmp.c:1044
msgid "variable-bindings uses indefinite length"
-msgstr "variable-bindings に使われている長さが不定です"
+msgstr "variable-bindings の長さが不定"
+
+
+#
+# End of "$Id$".
+#
msgid " %s Bad %s choice %s!\n REF: Page 122, section 5.17\n"
msgstr " %s 잘못된 %s - 선택사항 %s!\n REF: 122페이지, 섹션 5.17\n"
msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n"
-msgstr " %s %s 옵션에 대한 잘못된 \"%s\" UTF-8 번역 스트링!\n"
+msgstr " %1$s %3$s 옵션에 대한 잘못된 UTF-8 \"%2$s\" 번역 스트링!\n"
msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n"
-msgstr " %s %s 옵션에 대한 잘못된 \"%s\" UTF-8 번역 스트링, %s 선택사항!\n"
+msgstr " %1$s %3$s 옵션, %4$s 선택사항에 대한 잘못된 UTF-8 \"%2$s\" 번역 스트링!\n"
msgid " %s Bad cupsFilter value \"%s\"!\n"
msgstr " %s 잘못된 \"%s\" cupsFilter 값!\n"
msgid " %s Bad cupsICCProfile %s!\n"
msgid " %s Empty cupsUIConstraints %s!\n"
msgstr " %s cupsUIConstraints %s이(가) 비어있음!\n"
msgid " %s Missing \"%s\" translation string for option %s!\n"
-msgstr " %s %s 옵션에 대한 \"%s\" 번역 스트링 유실됨!\n"
+msgstr " %1$s %3$s 옵션에 대한 \"%2$s\" 번역 스트링 유실됨!\n"
msgid " %s Missing \"%s\" translation string for option %s, choice %s!\n"
-msgstr " %s %s 옵션에 대한 \"%s\" 번역 스트링 유실됨, %s 선택사항!\n"
+msgstr " %1$s %3$s 옵션, %4$s 선택사항에 대한 \"%2$s\" 번역 스트링 유실됨!\n"
msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n"
-msgstr " %s UIConstraint \"*%s %s *%s %s\"에 있는 *%s %s 선택사항 유실됨!\n"
+msgstr " %1$s \"*%4$s %5$s *%6$s %7$s\" UIConstraints에 있는 *%2$s %3$s 선택사항 유실됨!\n"
msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n"
-msgstr " %s %s cupsUIConstraints에 있는 *%s %s 선택사항 유실됨: \"%s\"!\n"
+msgstr " %1$s %4$s cupsUIConstraints에 있는 *%2$s %3$s 선택사항 유실됨: \"%5$s\"!\n"
msgid " %s Missing cupsFilter file \"%s\"\n"
msgstr " %s \"%s\" cupsFilter 파일이 유실됨\n"
msgid " %s Missing cupsICCProfile file \"%s\"!\n"
msgid " %s Missing cupsUIResolver %s!\n"
msgstr " %s %s cupsUIResolver 유실됨!\n"
msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n"
-msgstr " %s UIConstraint \"*%s %s *%s %s\"에 있는 %s 옵션 유실됨!\n"
+msgstr " %1$s \"*%3$s %4$s *%5$s %6$s\" UIConstraints에 있는 %2$s 옵션 유실됨!\n"
msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n"
-msgstr " %s %s cupsUIConstraints에 있는 %s 옵션 유실됨: \"%s\"!\n"
+msgstr " %1$s %3$s cupsUIConstraints에 있는 %2$s 옵션 유실됨: \"%4$s\"!\n"
msgid " %s No base translation \"%s\" is included in file!\n"
-msgstr " %s \"%s\" 기초 번역이 없는 것이 파일에 포함되어 있습니다!\n"
+msgstr " %s 파일에 \"%s\" 기초 번역이 포함되어 있지 않습니다!\n"
msgid " %s REQUIRED %s does not define choice None!\n REF: Page 122, section 5.17\n"
-msgstr " %s 선택사항을 정의하지 않는 필요한 %s이(가) 없음!\n REF: 122페이지, 섹션 5.17\n"
+msgstr " %s 선택사항 없음을 정의하지 않은 %s이(가) 필요!\n REF: 122페이지, 섹션 5.17\n"
msgid " %s cupsICCProfile %s hash value collides with %s!\n"
msgstr " %s 불필요한 %s cupsICCProfile 값이 %s와(과) 충돌함!\n"
msgid " %s cupsUIResolver %s causes a loop!\n"
msgid " **FAIL** BAD JobPatchFile attribute in file\n REF: Page 24, section 3.4.\n"
msgstr " **FAIL** 파일에 있는 잘못된 JobPatchFile 속성\n REF: 24페이지, 섹션 3.4.\n"
msgid " **FAIL** BAD Manufacturer (should be \"HP\")\n REF: Page 211, table D.1.\n"
-msgstr " **FAIL** 잘못된 Manufacturer(\"HP\"이어야 함)\n REF: 211페이지, table D.1.\n"
+msgstr " **FAIL** 잘못된 Manufacturer(\"HP\"이어야 함)\n REF: 211페이지, 표 D.1.\n"
msgid " **FAIL** BAD Manufacturer (should be \"Oki\")\n REF: Page 211, table D.1.\n"
-msgstr " **FAIL** 잘못된 Manufacturer(\"Oki\"이어야 함)\n REF: 211페이지, table D.1.\n"
+msgstr " **FAIL** 잘못된 Manufacturer(\"Oki\"이어야 함)\n REF: 211페이지, 표 D.1.\n"
msgid " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3.\n"
-msgstr " **FAIL** 잘못된 ModelName - \"%c\"은(는) 스트링에서 허용되지 않습니다.\n REF: 59-60페이지, section 5.3.\n"
+msgstr " **FAIL** 잘못된 ModelName - \"%c\"은(는) 스트링에서 허용되지 않습니다.\n REF: 59-60페이지, 섹션 5.3.\n"
msgid " **FAIL** BAD PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3.\n"
msgstr " **FAIL** 잘못된 PSVersion - \"(string) int\"이(가) 아닙니다.\n REF: 62-64페이지, 섹션 5.3.\n"
msgid " **FAIL** BAD Product - not \"(string)\".\n REF: Page 62, section 5.3.\n"
msgstr " **FAIL** 잘못된 Product - \"(string)\"이(가) 아닙니다.\n REF: 62페이지, 섹션 5.3.\n"
msgid " **FAIL** BAD ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3.\n"
-msgstr " **FAIL** 잘못된 ShortNickName - 31자 이상입니다.\n REF: 64-65페이지, 섹션 5.3.\n"
+msgstr " **FAIL** 잘못된 ShortNickName - 31자보다 깁니다.\n REF: 64-65페이지, 섹션 5.3.\n"
msgid " **FAIL** Bad %s choice %s!\n REF: Page 84, section 5.9\n"
msgstr " **FAIL** 잘못된 %s - 선택사항 %s!\n REF: 84페이지, 섹션 5.9\n"
msgid " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3.\n"
msgid " **FAIL** Option names %s and %s differ only by case!\n"
msgstr " **FAIL** %s 및 %s 옵션 이름이 경우별로만 다름!\n"
msgid " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5.\n"
-msgstr " **FAIL** 필요한 Default%s\n REF: 40페이지, section 4.5.\n"
+msgstr " **FAIL** Default%s 필요\n REF: 40페이지, 섹션 4.5.\n"
msgid " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15.\n"
-msgstr " **FAIL** 필요한 DefaultImageableArea\n REF: 102페이지, 섹션 5.15.\n"
+msgstr " **FAIL** DefaultImageableArea 필요\n REF: 102페이지, 섹션 5.15.\n"
msgid " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15.\n"
-msgstr " **FAIL** 필요한 DefaultPaperDimension\n REF: 103페이지, 섹션 5.15.\n"
+msgstr " **FAIL** DefaultPaperDimension 필요\n REF: 103페이지, 섹션 5.15.\n"
msgid " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3.\n"
-msgstr " **FAIL** 필요한 FileVersion\n REF: 56페이지, section 5.3.\n"
+msgstr " **FAIL** FileVersion 필요\n REF: 56페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3.\n"
-msgstr " **FAIL** 필요한 FormatVersion\n REF: 56페이지, 섹션 5.3.\n"
+msgstr " **FAIL** FormatVersion 필요\n REF: 56페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15.\n"
-msgstr " **FAIL** %s PageSize에 대한 필요한 ImageableArea\n REF: 41페이지, 섹션 5.\n REF: 102페이지, 섹션 5.15.\n"
+msgstr " **FAIL** %s PageSize에 대한 ImageableArea 필요\n REF: 41페이지, 섹션 5.\n REF: 102페이지, 섹션 5.15.\n"
msgid " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3.\n"
-msgstr " **FAIL** 필요한 LanguageEncoding\n REF: 56-57페이지, 섹션 5.3.\n"
+msgstr " **FAIL** LanguageEncoding 필요\n REF: 56-57페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3.\n"
-msgstr " **FAIL** 필요한 LanguageVersion\n REF: 57-58페이지, 섹션 5.3.\n"
+msgstr " **FAIL** LanguageVersion 필요\n REF: 57-58페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3.\n"
-msgstr " **FAIL** 필요한 Manufacturer\n REF: 58-59페이지, 섹션 5.3.\n"
+msgstr " **FAIL** Manufacturer 필요\n REF: 58-59페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3.\n"
-msgstr " **FAIL** 필요한 ModelName\n REF: 59-60페이지, 섹션 5.3.\n"
+msgstr " **FAIL** ModelName 필요\n REF: 59-60페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3.\n"
-msgstr " **FAIL** 필요한 NickName\n REF: 60페이지, 섹션 5.3.\n"
+msgstr " **FAIL** NickName 필요\n REF: 60페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3.\n"
-msgstr " **FAIL** 필요한 PCFileName\n REF: 61-62페이지, 섹션 5.3.\n"
+msgstr " **FAIL** PCFileName 필요\n REF: 61-62페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3.\n"
-msgstr " **FAIL** 필요한 PSVersion\n REF: 62-64페이지, 섹션 5.3.\n"
+msgstr " **FAIL** PSVersion 필요\n REF: 62-64페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14.\n"
-msgstr " **FAIL** 필요한 PageRegion\n REF: 100페이지, 섹션 5.14.\n"
+msgstr " **FAIL** PageRegion 필요\n REF: 100페이지, 섹션 5.14.\n"
msgid " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14.\n"
-msgstr " **FAIL** 필요한 PageSize\n REF: 41페이지, 섹션 5.\n REF: Page 99, section 5.14.\n"
+msgstr " **FAIL** PageSize 필요\n REF: 41페이지, 섹션 5.\n REF: 99페이지, 섹션 5.14.\n"
msgid " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14.\n"
-msgstr " **FAIL** 필요한 PageSize\n REF: 99-100페이지, 섹션 5.14.\n"
+msgstr " **FAIL** PageSize 필요\n REF: 99-100페이지, 섹션 5.14.\n"
msgid " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15.\n"
-msgstr " **FAIL** %s PageSize에 대한 필요한 PaperDimension\n REF: Page 41, 섹션 5.\n REF: 103페이지, 섹션 5.15.\n"
+msgstr " **FAIL** %s PageSize에 대한 PaperDimension 필요\n REF: 41페이지, 섹션 5.\n REF: 103페이지, 섹션 5.15.\n"
msgid " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3.\n"
-msgstr " **FAIL** 필요한 Product\n REF: 62페이지, 섹션 5.3.\n"
+msgstr " **FAIL** Product 필요\n REF: 62페이지, 섹션 5.3.\n"
msgid " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3.\n"
-msgstr " **FAIL** 필요한 ShortNickName\n REF: 64-65페이지, 섹션 5.3.\n"
+msgstr " **FAIL** ShortNickName 필요\n REF: 64-65페이지, 섹션 5.3.\n"
msgid " %d ERRORS FOUND\n"
-msgstr " %d 오류 발견\n"
+msgstr " %d개의 오류 발견\n"
msgid " Bad %%%%BoundingBox: on line %d!\n REF: Page 39, %%%%BoundingBox:\n"
msgstr " 잘못된 %%%%BoundingBox: %d번째 줄!\n REF: 39페이지, %%%%BoundingBox:\n"
msgid " Bad %%%%Page: on line %d!\n REF: Page 53, %%%%Page:\n"
msgid " Bad %%%%Pages: on line %d!\n REF: Page 43, %%%%Pages:\n"
msgstr " 잘못된 %%%%Pages: %d번째 줄!\n REF: 43페이지, %%%%Pages:\n"
msgid " Line %d is longer than 255 characters (%d)!\n REF: Page 25, Line Length\n"
-msgstr " %d번째 줄이 255자 이상입니다(%d)!\n REF: 25페이지, 줄 길이\n"
+msgstr " %d번째 줄이 255자보다 깁니다(%d)!\n REF: 25페이지, 줄 길이\n"
msgid " Missing %!PS-Adobe-3.0 on first line!\n REF: Page 17, 3.1 Conforming Documents\n"
msgstr " 첫번째 줄에 있는 %!PS-Adobe-3.0이 유실됨!\n REF: 17페이지, 3.1 도큐멘트 구성하기\n"
msgid " Missing %%EndComments comment!\n REF: Page 41, %%EndComments\n"
msgid " Too many %%EndDocument comments!\n"
msgstr " 너무 많은 %%EndDocument 설명!\n"
msgid " Warning: file contains binary data!\n"
-msgstr " WARN: 파일에 바이너리 데이터가 포함되어 있습니다!\n"
+msgstr " 경고: 파일에 바이너리 데이터가 포함되어 있습니다!\n"
msgid " Warning: no %%EndComments comment in file!\n"
-msgstr " WARN: 파일에 %%EndComments 설명이 없습니다!\n"
+msgstr " 경고: 파일에 %%EndComments 설명이 없습니다!\n"
msgid " Warning: obsolete DSC version %.1f in file!\n"
-msgstr " WARN: 파일에 이전 DSC 버전 %.1f가 있습니다!\n"
+msgstr " 경고: 파일에 이전 DSC 버전 %.1f가 있습니다!\n"
msgid " FAIL\n"
msgstr " FAIL\n"
msgid " FAIL\n **FAIL** Unable to open PPD file - %s\n"
msgid " FAIL\n **FAIL** Unable to open PPD file - %s on line %d.\n"
msgstr " FAIL\n **FAIL** PPD 파일을 열 수 없음 - %s, %d번째 줄.\n"
msgid " PASS\n"
-msgstr " 통과\n"
+msgstr " PASS\n"
msgid "#10 Envelope"
msgstr "#10 봉투"
msgid "#11 Envelope"
msgid "%.0f x %.0f millimeters"
msgstr "%.0f x %.0fmm"
msgid "%.0f x %.0f to %.0f x %.0f millimeters"
-msgstr "%.0f x %.0f to %.0f x %.0fmm"
+msgstr "%.0f x %.0f~%.0f x %.0fmm"
msgid "%.2f x %.2f inches"
msgstr "%.2f x %.2f인치"
msgid "%.2f x %.2f to %.2f x %.2f inches"
-msgstr "%.2f x %.2f to %.2f x %.2f인치"
+msgstr "%.2f x %.2f~%.2f x %.2f인치"
msgid "%s accepting requests since %s\n"
-msgstr " %s 이후에 %s 승인 요청\n"
+msgstr " %2$s 이후에 %1$s 승인 요청\n"
msgid "%s cannot be changed."
msgstr "%s을(를) 변경할 수 없습니다."
msgid "%s is not implemented by the CUPS version of lpc.\n"
msgid "%s is ready and printing\n"
msgstr "%s이(가) 준비되었고 프린트 중\n"
msgid "%s not accepting requests since %s -\n\t%s\n"
-msgstr "%s 이후에 %s 승인 요청 안 함 -\n\t%s\n"
+msgstr "%2$s 이후에 %1$s 승인 요청 안 함 -\n\t%1$s\n"
msgid "%s not supported!"
msgstr "%s이(가) 지원되지 않음!"
msgid "%s/%s accepting requests since %s\n"
-msgstr "%s 이후에 %s/%s 승인 요청\n"
+msgstr "%3$s 이후에 %1$s/%2$s 승인 요청\n"
msgid "%s/%s not accepting requests since %s -\n\t%s\n"
-msgstr "%s 이후에 %s/%s 승인 요청 안 함 -\n\t%s\n"
+msgstr "%3$s 이후에 %1$s/%2$s 승인 요청 안 함 -\n\t%4$s\n"
msgid "%s: %-33.33s [job %d localhost]\n"
msgstr "%s: %-33.33s [작업 %d 로컬호스트]\n"
msgid "%s: %s failed: %s\n"
msgid "%s: Don't know what to do!\n"
msgstr "%s: 해야할 일을 모르겠음!\n"
msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr "%s: 오류 - \"%s\" 대상에 존재하지 않는 %s 환경 변수 이름!\n"
+msgstr "%1$s: 오류 - \"%3$s\" 대상에 존재하지 않는 %2$s 환경 변수 이름!\n"
msgid "%s: Error - bad job ID!\n"
msgstr "%s: 오류 - 잘못된 작업 ID!\n"
msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
msgid "%s: Error - expected character set after '-S' option!\n"
msgstr "%s: 오류 - '-S' 옵션 뒤에 문자 세트가 예상됨!\n"
msgid "%s: Error - expected content type after '-T' option!\n"
-msgstr "%s: 오류 - '-T' 옵션 뒤에 콘텐츠 유형이 예상됨 !\n"
+msgstr "%s: 오류 - '-T' 옵션 뒤에 콘텐츠 유형이 예상됨!\n"
msgid "%s: Error - expected copies after '-n' option!\n"
-msgstr "%s: 오류 - -n' 옵션 뒤에 장 수가 예상됨!\n"
+msgstr "%s: 오류 - '-n' 옵션 뒤에 복사 매수가 예상됨!\n"
msgid "%s: Error - expected copy count after '-#' option!\n"
msgstr "%s: 오류 - '-#' 옵션 뒤에 복사본 수가 예상됨!\n"
msgid "%s: Error - expected destination after '-P' option!\n"
msgid "%s: Error - expected value after '-%c' option!\n"
msgstr "%s: 오류 - '-%c' 옵션 뒤에 값이 예상됨!\n"
msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
-msgstr "%s: 오류 - '-W' 옵션 뒤에 \"완료됨\", \"완료되지 않음\" 또는 \"모두\"가 필요!\n"
+msgstr "%s: 오류 - '-W' 옵션 뒤에 \"completed\", \"not-completed\" 또는 \"all\"이 필요!\n"
msgid "%s: Error - no default destination available.\n"
msgstr "%s: 오류 - 사용 가능한 기본 대상이 없습니다.\n"
msgid "%s: Error - priority must be between 1 and 100.\n"
msgid "%s: Unable to determine MIME type of \"%s\"!\n"
msgstr "%s: MIME 유형의 \"%s\"을(를) 결정할 수 없음!\n"
msgid "%s: Unable to open %s - %s\n"
-msgstr "%s: %s를 열 수 없음 - %s\n"
+msgstr "%s: %s을(를) 열 수 없음 - %s\n"
+msgid "%s: Unable to open %s - %s on line %d.\n"
+msgstr "%s: %s을(를) 열 수 없음 - %s, %d번째 줄\n"
msgid "%s: Unable to open %s: %s\n"
msgstr "%s: %s을(를) 열 수 없음: %s\n"
msgid "%s: Unable to open PPD file: %s on line %d\n"
-msgstr "%1$s: %3$d번째 줄에 있는 %2$s PPD 파일을 열 수 없음\n"
+msgstr "%s: PPD 파일을 열 수 없음: %s, %d번째 줄\n"
msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n"
msgstr "%s: \"%s\" 또는 \"%s\"에서 MIME 데이터베이스를 읽을 수 없음!\n"
msgid "%s: Unknown destination \"%s\"!\n"
msgid "%s: Warning - mode option ignored!\n"
msgstr "%s: 경고 - 모드 옵션이 무시됨!\n"
msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
-msgstr "%s: 오류 - \"%s\" 대상에 존재하지 않는 %s 환경 변수 이름!\n"
+msgstr "%1$s: 오류 - \"%3$s\" 대상에 존재하지 않는 %2$s 환경 변수 이름!\n"
msgid "%s: error - expected option=value after '-o' option!\n"
-msgstr "%s: 오류 - '-o' 옵션 뒤에 옵션=값이 예상됨!\n"
+msgstr "%s: 오류 - '-o' 옵션 뒤에 option=value가 예상됨!\n"
msgid "%s: error - no default destination available.\n"
msgstr "%s: 오류 - 사용 가능한 기본 대상이 없습니다.\n"
msgid "-1"
msgid "A Samba username is required to export printer drivers!"
msgstr "프린터 드라이버를 보내려면 Samba 사용자 이름이 필요함!"
msgid "A class named \"%s\" already exists!"
-msgstr "\"%s\"라는 이름의 클래스가 이미 존재합니다!"
+msgstr "\"%s\"(이)라는 이름의 클래스가 이미 존재합니다!"
msgid "A printer named \"%s\" already exists!"
-msgstr "\"%s\"라는 이름의 프린터가 이미 존재합니다!"
+msgstr "\"%s\"(이)라는 이름의 프린터가 이미 존재합니다!"
msgid "A0"
msgstr "A0"
msgid "A1"
msgid "Bad UIConstraints"
msgstr "잘못된 UIConstraints"
msgid "Bad copies value %d."
-msgstr "잘못된 복사본 값 %d."
+msgstr "잘못된 복사 매수 값 %d."
msgid "Bad custom parameter"
msgstr "잘못된 사용자 설정 매개변수"
msgid "Bad device URI \"%s\"!\n"
msgid "Bad number-up value %d."
msgstr "잘못된 number-up 값 %d."
msgid "Bad option + choice on line %d!"
-msgstr "%d번째 줄에 있는 잘못된 옵션 + 선택!"
+msgstr "%d번째 줄에 있는 잘못된 옵션 + 선택사항!"
msgid "Bad page-ranges values %d-%d."
msgstr "잘못된 page-ranges 값 %d-%d."
msgid "Bad port-monitor \"%s\"!"
msgid "CMYK"
msgstr "CMYK"
msgid "CPCL Label Printer"
-msgstr "CPCL 레이블 프린터"
+msgstr "CPCL 레이블 프린터"
msgid "Cancel RSS Subscription"
msgstr "RSS 구독 취소"
msgid "Change Settings"
-msgstr "설정 값 변경"
+msgstr "설정값 변경"
msgid "Character set \"%s\" not supported!"
-msgstr "\"%s\" 문ì\9e\90 ì\84¤ì \95ì\9d´ 지원되지 않음!"
+msgstr "\"%s\" 문ì\9e\90 ì\84¸í\8a¸ê°\80 지원되지 않음!"
msgid "Chou3 Envelope"
msgstr "Chou3 봉투"
msgid "Chou4 Envelope"
msgid "Color Mode"
msgstr "색상 모드"
msgid "Commands may be abbreviated. Commands are:\n\nexit help quit status ?\n"
-msgstr "명령이 생략될 수 있습니다. 명령은 다음과 같습니다:\n\n종료 도움말 종료 상태 ?\n"
+msgstr "명령이 생략될 수 있습니다. 명령은 다음과 같습니다:\n\nexit help quit status ?\n"
msgid "Community name uses indefinite length"
msgstr "커뮤니티 이름 길이가 무제한입니다"
msgid "Continue"
msgid "Developer empty!"
msgstr "현상액이 비어 있음!"
msgid "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n"
-msgstr "장비: uri = %s\n 클래스 = %s\n 정보 = %s\n 제작 및 모델 = %s\n 장비-id = %s\n 위치 = %s\n"
+msgstr "장비: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n"
msgid "Direct Thermal Media"
msgstr "직접 열 미디어"
msgid "Disabled"
msgid "Duplexer"
msgstr "양면 프린터"
msgid "Dymo"
-msgstr "다이모"
+msgstr "Dymo"
msgid "EMERG: Unable to allocate memory for page info: %s\n"
msgstr "EMERG: 페이지 정보에 메모리를 할당할 수 없습니다: %s\n"
msgid "EMERG: Unable to allocate memory for pages array: %s\n"
-msgstr "EMERG: 페이지 ì\96´ë \88ì\9d´ì\97\90 ë©\94모리를 í\95 ë\8b¹í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %s\n"
+msgstr "EMERG: 페이지 ë°°ì\97´ì\97\90 ë©\94모리를 í\95 ë\8b¹í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %s\n"
msgid "EPL1 Label Printer"
msgstr "EPL1 레이블 프린터"
msgid "EPL2 Label Printer"
msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n"
msgstr "ERROR: 잘못된 %%PageBoundingBox: 파일에 있는 설명!\n"
msgid "ERROR: Bad SCSI device file \"%s\"!\n"
-msgstr "ERROR: 잘못된 \"%s\" SCSI 장비 파일!\n"
+msgstr "ERROR: 잘못된 SCSI 장비 파일 \"%s\"!\n"
msgid "ERROR: Bad charset file %s\n"
-msgstr "ERROR: 잘못된 %s 문자 파일\n"
+msgstr "ERROR: 잘못된 문자 세트 파일 %s\n"
msgid "ERROR: Bad charset type %s\n"
-msgstr "ERROR: 잘못된 %s 문자 유형\n"
+msgstr "ERROR: 잘못된 문자 세트 유형 %s\n"
msgid "ERROR: Bad columns value %d!\n"
msgstr "ERROR: 잘못된 열 값 %d!\n"
msgid "ERROR: Bad cpi value %f!\n"
msgid "ERROR: Expected quoted string on line %d of %s!\n"
msgstr "ERROR: %2$s의 %1$d번째 줄에 인용 스트링이 예상됨!\n"
msgid "ERROR: Fatal USB error!\n"
-msgstr "ERROR: 심각한USB 오류!\n"
+msgstr "ERROR: 심각한 USB 오류!\n"
msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n"
msgstr "ERROR: 파일을 프린트할 수 없는, 유효하지 않은 HP-GL/2 명령이 보임!\n"
msgid "ERROR: Missing %%EndProlog!\n"
msgid "ERROR: Missing %%EndSetup!\n"
msgstr "ERROR: %%EndSetup이 유실됨!\n"
msgid "ERROR: Missing device URI on command-line and no DEVICE_URI environment variable!\n"
-msgstr "ERROR: 명령 라인의 장비 URI이 유실되었고 DEVICE_URI 환경 변수가 없음!\n"
+msgstr "ERROR: 명령 라인의 장비 URI가 유실되었고 DEVICE_URI 환경 변수가 없음!\n"
msgid "ERROR: Missing value on line %d of banner file!\n"
msgstr "ERROR: 배너 파일의 %d번째 줄 값이 유실됨!\n"
msgid "ERROR: Need a msgid line before any translation strings on line %d of %s!\n"
-msgstr "ERROR: %2$s의 %1$d번째 줄에 있는 모든 번역 스트링 앞에 msgid 필요!\n"
+msgstr "ERROR: %2$s의 %1$d번째 줄에 있는 모든 번역 스트링 앞에 msgid 줄 필요!\n"
msgid "ERROR: No %%BoundingBox: comment in header!\n"
msgstr "ERROR: %%BoundingBox가 없음: 머리말에 설명!\n"
msgid "ERROR: No %%Pages: comment in header!\n"
msgstr "ERROR: %%Pages가 없음: 머리말에 설명!\n"
msgid "ERROR: No device URI found in argv[0] or in DEVICE_URI environment variable!\n"
-msgstr "ERROR: argv[0] 또는 DEVICE_URI 환경에서 발견된 장비 URI가 없음!\n"
+msgstr "ERROR: argv[0] 또는 DEVICE_URI 환경 변수에서 발견된 장비 URI가 없음!\n"
msgid "ERROR: No fonts in charset file %s\n"
msgstr "ERROR: %s 문자 세트 파일에 서체 없음\n"
msgid "ERROR: No pages found!\n"
msgid "ERROR: Out of paper!\n"
msgstr "ERROR: 종이 없음!\n"
msgid "ERROR: PRINTER environment variable not defined!\n"
-msgstr "ERROR: 프린터 환경 변수가 정의되지 않음!\n"
+msgstr "ERROR: PRINTER 환경 변수가 정의되지 않음!\n"
msgid "ERROR: Print file was not accepted (%s)!\n"
msgstr "ERROR: 프린트 파일이 허용되지 않음(%s)!\n"
msgid "ERROR: Printer not responding\n"
msgid "ERROR: Printer sent unexpected EOF\n"
msgstr "ERROR: 프린터가 예기치 않은 EOF를 보냄\n"
msgid "ERROR: Remote host did not accept control file (%d)\n"
-msgstr "ERROR: 원격 호스트가 제어 파일(%d)을 허용하지 않음\n"
+msgstr "ERROR: 원격 호스트가 제어 파일을 허용하지 않음(%d)\n"
msgid "ERROR: Remote host did not accept data file (%d)\n"
-msgstr "ERROR: 원격 호스트가 데이터 파일(%d)을 허용하지 않음\n"
+msgstr "ERROR: 원격 호스트가 데이터 파일을 허용하지 않음(%d)\n"
msgid "ERROR: There was a timeout error while sending data to the printer\n"
msgstr "ERROR: 데이터를 프린터로 전송하는 동안 시간초과 오류가 발생했습니다\n"
msgid "ERROR: Unable to add file %d to job: %s\n"
msgid "ERROR: Unable to create temporary file: %s\n"
msgstr "ERROR: 임시 파일을 생성할 수 없음: %s\n"
msgid "ERROR: Unable to exec pictwpstops: %s\n"
-msgstr "ERROR: pictwpstops를 ì\83\9dì\84±할 수 없음: %s\n"
+msgstr "ERROR: pictwpstops를 ì\8b¤í\96\89할 수 없음: %s\n"
msgid "ERROR: Unable to execute gs program"
msgstr "ERROR: gs 프로그램을 실행할 수 없음"
msgid "ERROR: Unable to execute pdftops program"
msgstr "ERROR: pdftops 프로그램을 실행할 수 없음"
msgid "ERROR: Unable to fork pictwpstops: %s\n"
-msgstr "ERROR: pictwpstops를 분리할 수 없음: %s\n"
+msgstr "ERROR: pictwpstops를 분리(fork)할 수 없음: %s\n"
msgid "ERROR: Unable to get PAP request"
msgstr "ERROR: PAP 요청을 얻을 수 없음"
msgid "ERROR: Unable to get PAP response"
-msgstr "ERROR: PAP 반응을 얻을 수 없음"
+msgstr "ERROR: PAP 응답을 얻을 수 없음"
msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n"
-msgstr "ERROR: \"%s\"í\94\84린í\84°ì\97\90 ë\8c\80í\95\9c PPD í\8c\8cì\9d¼ì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤. - %s.\n"
+msgstr "ERROR: \"%s\"í\94\84린í\84°ì\97\90 ë\8c\80í\95\9c PPD í\8c\8cì\9d¼ì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\9d\8c - %s.\n"
msgid "ERROR: Unable to get default AppleTalk zone"
msgstr "ERROR: 기본 AppleTalk 영역을 얻을 수 없음"
msgid "ERROR: Unable to get job %d attributes (%s)!\n"
-msgstr "ERROR: %d 작업 속성을 얻을 수 없음(%s)!\n"
+msgstr "ERROR: 작업 %d 속성을 얻을 수 없음(%s)!\n"
msgid "ERROR: Unable to get printer status (%s)!\n"
msgstr "ERROR: 프린터 상태를 알 수 없음(%s)!\n"
msgid "ERROR: Unable to locate printer '%s'!\n"
msgstr "ERROR: '%s' 프린터를 찾을 수 없음!\n"
msgid "ERROR: Unable to look for PAP response"
-msgstr "ERROR: PAP 반응을 찾을 수 없음"
+msgstr "ERROR: PAP 응답을 찾을 수 없음"
msgid "ERROR: Unable to lookup AppleTalk printers"
msgstr "ERROR: AppleTalk 프린터를 찾을 수 없음"
msgid "ERROR: Unable to make AppleTalk address"
msgid "ERROR: Unable to open temporary file"
msgstr "ERROR: 임시 파일을 열 수 없음"
msgid "ERROR: Unable to print %d text columns!\n"
-msgstr "ERROR: %d 텍스트 열을 프린트할 수 없음!\n"
+msgstr "ERROR: %d개의 텍스트 열을 프린트할 수 없음!\n"
msgid "ERROR: Unable to print %dx%d text page!\n"
msgstr "ERROR: %dx%d 텍스트 페이지를 프린트할 수 없음!\n"
msgid "ERROR: Unable to read print data"
msgid "ERROR: Unable to reserve port"
msgstr "ERROR: 포트를 예약할 수 없음"
msgid "ERROR: Unable to seek to offset %ld in file - %s\n"
-msgstr "ERROR: 파일에 있는 %ld 오프셋을 찾을 수 없음 - %s\n"
+msgstr "ERROR: 파일에서 %ld 오프셋을 찾을 수 없음 - %s\n"
msgid "ERROR: Unable to seek to offset %lld in file - %s\n"
-msgstr "ERROR: 파일에 있는 %lld 오프셋을 찾을 수 없음 - %s\n"
+msgstr "ERROR: 파일에서 %lld 오프셋을 찾을 수 없음 - %s\n"
msgid "ERROR: Unable to send LPD command"
msgstr "ERROR: LPD 명령을 보낼 수 없음"
msgid "ERROR: Unable to send PAP tickle request"
msgid "ERROR: Unable to send print file to printer"
msgstr "ERROR: 프린트 파일을 프린터로 보낼 수 없음"
msgid "ERROR: Unable to send trailing nul to printer"
-msgstr "ERROR: 추적 nul을 프린터로 보낼 수 없음"
+msgstr "ERROR: 끝자리 nul을 프린터로 보낼 수 없음"
msgid "ERROR: Unable to wait for pictwpstops: %s\n"
msgstr "ERROR: pictwpstops를 기다릴 수 없음: %s\n"
msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n"
msgid "ERROR: Unknown message catalog format for \"%s\"!\n"
msgstr "ERROR: \"%s\"에 대한 알 수 없는 메시지 카탈로그 포맷!\n"
msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n"
-msgstr "ERROR: \"%s\" 값을 가진 알 수 없는 \"%s\" 옵션!\n"
+msgstr "ERROR: \"%2$s\" 값이 있는 알 수 없는 \"%1$s\" 옵션!\n"
msgid "ERROR: Unknown print mode \"%s\"\n"
msgstr "ERROR: 알 수 없는 \"%s\" 프린트 모드\n"
msgid "ERROR: Unknown version option value \"%s\"!\n"
msgstr "ERROR: 알 수 없는 \"%s\" 버전 옵션 값!\n"
msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n"
-msgstr "ERROR: 밝기=100을 사용하는, 지원되지 않는 %s 밝기 값!\n"
+msgstr "ERROR: brightness=100을 사용하는, 지원되지 않는 밝기 값 %s!\n"
msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n"
-msgstr "ERROR: 감마=1000을 사용하는, 지원되지 않는 %s 감마 값ㅍ!\n"
+msgstr "ERROR: gamma=1000을 사용하는, 지원되지 않는 감마 값 %s!\n"
msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n"
-msgstr "ERROR: number-up=1을 사용하는, 지원되지 않는 %d number-up 값!\n"
+msgstr "ERROR: number-up=1을 사용하는, 지원되지 않는 number-up 값 %d!\n"
msgid "ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n"
-msgstr "ERROR: number-up-layout=lrtb을 사용하는, 지원되지 않는 number-up-layout %s!\n"
+msgstr "ERROR: number-up-layout=lrtb을 사용하는, 지원되지 않는 number-up-layout 값 %s!\n"
msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n"
-msgstr "ERROR: page-border=없음을 사용하는, 지원되지 않는 page-border 값 %s!\n"
+msgstr "ERROR: page-border=none을 사용하는, 지원되지 않는 page-border 값 %s!\n"
msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n"
msgstr "ERROR: doc_printf 오버플로우(%d바이트)가 발견됨, 중단 중!\n"
msgid "ERROR: pdftops filter crashed on signal %d!\n"
-msgstr "ERROR: pictwpstopsê°\80 %d ì\8b í\98¸ì\97\90ì\84\9c ì¢\85ë£\8cë\90¨!\n"
+msgstr "ERROR: pdftops í\95\84í\84°ê°\80 ì\8b í\98¸ %dì\97\90ì\84\9c 충ë\8f\8cí\95¨!\n"
msgid "ERROR: pdftops filter exited with status %d!\n"
-msgstr "ERROR: pictwpstops가 %d 상태로 종료됨!\n"
+msgstr "ERROR: pdftops 필터가 상태 %d(으)로 종료됨!\n"
msgid "ERROR: pictwpstops exited on signal %d!\n"
-msgstr "ERROR: pictwpstops가 %d 신호에서 종료됨!\n"
+msgstr "ERROR: pictwpstops가 신호 %d에서 종료됨!\n"
msgid "ERROR: pictwpstops exited with status %d!\n"
-msgstr "ERROR: pictwpstops가 %d 상태로 종료됨!\n"
+msgstr "ERROR: pictwpstops가 상태 %d(으)로 종료됨!\n"
msgid "ERROR: recoverable: Unable to connect to printer; will retry in 30 seconds...\n"
msgstr "ERROR: 복원 가능: 프린터에 연결할 수 없음; 30초 후에 다시 시도...\n"
msgid "ERROR: select() failed"
-msgstr "ERROR: 선택() 실패"
+msgstr "ERROR: select() 실패"
msgid "ERROR: unable to stat print file"
msgstr "ERROR: 프린트 파일을 시작할 수 없음"
msgid "Edit Configuration File"
msgid "Enter password:"
msgstr "암호 입력:"
msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."
-msgstr "이 페이지에 연결하려면 사용자 이름 및 암호 또는 루트 사용자 이름 및 암호를 입력하십시오. Kerberos 인증을 사용하고 있다면, 유효한 Kerberos 티켓을 가지고 있는지 확인하십시오."
+msgstr "이 페이지에 연결하려면 사용자 이름 및 암호 또는 root 사용자 이름 및 암호를 입력하십시오. Kerberos 인증을 사용하고 있다면, 유효한 Kerberos 티켓을 가지고 있는지 확인하십시오."
msgid "Envelope Feed"
msgstr "봉투 공급"
msgid "Epson"
msgid "Error Policy"
msgstr "오류 정책"
msgid "Error: need hostname after '-h' option!\n"
-msgstr "오류: '-h' 옵션 뒤에 호스트 이름이 필요함!!\n"
+msgstr "오류: '-h' 옵션 뒤에 호스트 이름이 필요!\n"
msgid "Every 10 Labels"
-msgstr "10레이블마다"
+msgstr "10개 레이블마다"
msgid "Every 2 Labels"
-msgstr "2레이블마다"
+msgstr "2개 레이블마다"
msgid "Every 3 Labels"
-msgstr "3레이블마다"
+msgstr "3개 레이블마다"
msgid "Every 4 Labels"
-msgstr "4레이블마다"
+msgstr "4개 레이블마다"
msgid "Every 5 Labels"
-msgstr "5레이블마다"
+msgstr "5개 레이블마다"
msgid "Every 6 Labels"
-msgstr "6레이블마다"
+msgstr "6개 레이블마다"
msgid "Every 7 Labels"
-msgstr "7레이블마다"
+msgstr "7개 레이블마다"
msgid "Every 8 Labels"
-msgstr "8레이블마다"
+msgstr "8개 레이블마다"
msgid "Every 9 Labels"
-msgstr "9레이블마다"
+msgstr "9개 레이블마다"
msgid "Every Label"
msgstr "모든 레이블"
msgid "Expectation Failed"
msgid "File Folder - 9/16 x 3 7/16\""
msgstr "파일 폴더 - 9/16 x 3 7/16\""
msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
-msgstr "파일 장비 URI가 비활성화되었습니다! 활성화하려면, \"%s/cupsd.conf\"에 있는 FileDevice를 보십시오."
+msgstr "파일 장비 URI가 비활성화되었습니다! 활성화하려면, \"%s/cupsd.conf\"에 있는 FileDevice 지시문을 보십시오."
msgid "Folio"
-msgstr "폴리오"
+msgstr "2절지"
msgid "Forbidden"
msgstr "금지됨"
msgid "Fuser temperature high!"
-msgstr "Fuser 온도가 높음!"
+msgstr "퓨저 온도가 높음!"
msgid "Fuser temperature low!"
-msgstr "Fuser 온도가 낮음!"
+msgstr "퓨저 온도가 낮음!"
msgid "General"
msgstr "일반"
msgid "Generic"
msgid "German FanFold"
msgstr "독일 FanFold"
msgid "German FanFold Legal"
-msgstr "독일 FanFold Legal"
+msgstr "독일 FanFold 공문서"
msgid "Get-Response-PDU uses indefinite length"
msgstr "Get-Response-PDU 길이가 무제한입니다"
msgid "Glossy Paper"
msgid "INFO: Opening connection\n"
msgstr "INFO: 연결 열기\n"
msgid "INFO: Print file sent, waiting for printer to finish...\n"
-msgstr "INFO: 프린트 파일을 보냈고, 프린터 작업이 종료 대기 중...\n"
+msgstr "INFO: 프린트 파일을 보냈고, 프린터 작업 종료 대기 중...\n"
msgid "INFO: Printer busy; will retry in 10 seconds...\n"
msgstr "INFO: 프린터 사용 중; 10초 후에 다시 시도...\n"
msgid "INFO: Printer busy; will retry in 30 seconds...\n"
msgid "INFO: Sending print data...\n"
msgstr "INFO: 프린트 데이터 보내는 중...\n"
msgid "INFO: Sent print file, %ld bytes...\n"
-msgstr "INFO: í\94\84린í\8a¸ í\8c\8cì\9d¼ ë³´ë\82´ê¸°, %ld바이트...\n"
+msgstr "INFO: í\94\84린í\8a¸ í\8c\8cì\9d¼ ë³´ë\83\84, %ld바이트...\n"
msgid "INFO: Sent print file, %lld bytes...\n"
-msgstr "INFO: í\94\84린í\8a¸ í\8c\8cì\9d¼ ë³´ë\82´ê¸°, %lld바이트...\n"
+msgstr "INFO: í\94\84린í\8a¸ í\8c\8cì\9d¼ ë³´ë\83\84, %lld바이트...\n"
msgid "INFO: Spooling LPR job, %.0f%% complete...\n"
msgstr "INFO: LPR 작업 스풀 중, %.0f%% 완료...\n"
msgid "INFO: Unable to contact printer, queuing on next printer in class...\n"
msgstr "INFO: 프린터에 연결할 수 없기 때문에, 클래스에 있는 다음 프린터 대기 중...\n"
msgid "INFO: Using default AppleTalk zone \"%s\"\n"
-msgstr "INFO: 기본 AppleTalk 영역 사용 중 \"%s\"\n"
+msgstr "INFO: \"%s\" 기본 AppleTalk 영역 사용 중 \n"
msgid "INFO: Waiting for job to complete...\n"
msgstr "INFO: 작업 완료 대기 중...\n"
msgid "INFO: Waiting for printer to become available...\n"
msgid "Illegal option keyword string"
msgstr "올바르지 않은 옵션 키워드 스트링"
msgid "Illegal translation string"
-msgstr "올바르지 번역 스트링"
+msgstr "올바르지 않은 번역 스트링"
msgid "Illegal whitespace character"
msgstr "올바르지 않은 여백 문자"
msgid "Ink/toner almost empty."
msgid "Job #%d is not complete!"
msgstr "#%d 작업이 왼료되지 않음!"
msgid "Job #%d is not held for authentication!"
-msgstr "#%d 작업이 인증되지 않음!"
+msgstr "#%d 작업이 인증을 위해 유지되지 않음!"
msgid "Job #%d is not held!"
msgstr "#%d 작업이 유지되지 않음!"
msgid "Job #%s does not exist!"
msgstr "#%s 작업이 존재하지 않음!"
msgid "Job %d not found!"
-msgstr "#%d 작업이 발견되지 않음!"
+msgstr "%d 작업이 발견되지 않음!"
msgid "Job Completed"
msgstr "작업이 완료됨"
msgid "Job Created"
msgid "Long-Edge (Portrait)"
msgstr "가장자리 길게(세로)"
msgid "Make and Model: "
-msgstr "ì\83\9dì\84± 및 모델: "
+msgstr "ì \9cì¡°ì\82¬ 및 모델: "
msgid "Manual Feed"
msgstr "수동 공급"
msgid "Media Dimensions: "
msgid "Media Type"
msgstr "미디어 유형"
msgid "Media jam!"
-msgstr "미디어 정체!"
+msgstr "미디어가 걸림!"
msgid "Media tray almost empty."
msgstr "미디어 트레이가 거의 비었습니다."
msgid "Media tray empty!"
-msgstr "미디어 트레이가 비어있음!"
+msgstr "미디어 트레이가 비어 있음!"
msgid "Media tray missing!"
msgstr "미디어 트레이가 유실됨!"
msgid "Media tray needs to be filled."
msgid "Missing asterisk in column 1"
msgstr "1열에 있는 별표가 유실됨"
msgid "Missing document-number attribute!"
-msgstr "도큐멘트 번호 속성이 유실됨!"
+msgstr "document-number 속성이 유실됨!"
msgid "Missing double quote on line %d!"
msgstr "%d번째 줄에 있는 큰 따옴표가 유실됨!"
msgid "Missing form variable!"
msgid "Missing value string"
msgstr "값 스트링이 유실됨"
msgid "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n"
-msgstr "모델: 이름 = %s\n 기본 언어 = %s\n 생성 및 모델 = %s\n 장비 id = %s\n"
+msgstr "모델: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n"
msgid "Modify Class"
msgstr "클래스 수정"
msgid "Modify Printer"
msgid "NULL PPD file pointer"
msgstr "NULL PPD 파일 포인터"
msgid "Name OID uses indefinite length"
-msgstr "OID 이름 길이가 무제한입니다"
+msgstr "이름 OID 길이가 무제한입니다"
msgid "Never"
msgstr "안 함"
msgid "New Stylus Color Series"
-msgstr "새로운 Stylus 색상 시리즈"
+msgstr "새로운 Stylus Color 시리즈"
msgid "New Stylus Photo Series"
-msgstr "새로운 Stylus 사진 시리즈"
+msgstr "새로운 Stylus Photo 시리즈"
msgid "No"
-msgstr "ì\95\84ë\8b\88ì\98¤"
+msgstr "ì\95\84ë\8b\88ì\9a\94"
msgid "No Content"
msgstr "콘텐츠 없음"
msgid "No PPD name!"
msgid "No Windows printer drivers are installed!"
msgstr "설치된 Windows 프린터 드라이버가 없음!"
msgid "No active connection"
-msgstr "í\99\9cì\84± ì\9e\91ì\97\85이 없음"
+msgstr "í\99\9cì\84± ì\97°ê²°이 없음"
msgid "No active jobs on %s!"
msgstr "%s에 활성 작업이 없음!"
msgid "No attributes in request!"
msgstr "요청에 속성이 없음!"
msgid "No authentication information provided!"
-msgstr "ì \9cê³µë\90\9c ì \95ë³´ì\97\90 ì\9d¸ì¦\9dì\9d´ 없음!"
+msgstr "ì \9cê³µë\90\9c ì\9d¸ì¦\9d ì \95ë³´ê°\80 없음!"
msgid "No community name"
msgstr "커뮤니티 이름 없음"
msgid "No default printer"
msgid "No destinations added."
msgstr "추가된 대상이 없습니다."
msgid "No error-index"
-msgstr "오류-인덱스 없음"
+msgstr "error-index 없음"
msgid "No error-status"
-msgstr "오류-상태 없음"
+msgstr "error-status 없음"
msgid "No file!?!"
msgstr "파일이 없음!?!"
msgid "No modification time!"
msgstr "수정 시간 없음!"
msgid "No name OID"
-msgstr "OID 이름 없음"
+msgstr "이름 OID 없음"
msgid "No printer name!"
msgstr "프린터 이름 없음!"
msgid "No printer-uri found for class!"
msgid "No subscription attributes in request!"
msgstr "요청에 구독 속성이 없음!"
msgid "No subscriptions found."
-msgstr "구독이 없습니다."
+msgstr "발견된 구독이 없습니다."
msgid "No variable-bindings SEQUENCE"
msgstr "variable-bindings SEQUENCE 없음"
msgid "No version number"
msgid "OpenGroup without a CloseGroup first"
msgstr "우선 CloseGroup이 없는 OpenGroup"
msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
-msgstr "우선 CloseUI/JCLCloseUI이 없는 OpenUI/JCLOpenUI"
+msgstr "우선 CloseUI/JCLCloseUI가 없는 OpenUI/JCLOpenUI"
msgid "Operation Policy"
msgstr "동작 정책"
msgid "Options Installed"
msgid "Output Mode"
msgstr "출력 모드"
msgid "Output bin almost full."
-msgstr "ì¶\9cë ¥ì\86\8c ê±°ì\9d\98 ì°¾습니다."
+msgstr "ì¶\9cë ¥ì\86\8c ê±°ì\9d\98 ì°¼습니다."
msgid "Output bin full!"
-msgstr "출력소가 가득 참!"
+msgstr "출력소가 찼습니다!"
msgid "Output for printer %s is sent to %s\n"
msgstr "%s 프린터 출력을 %s(으)로 보냄\n"
msgid "Output for printer %s is sent to remote printer %s on %s\n"
-msgstr "%s 프린터 출력을 %s에 있는 %s 원격 프린터로 보냄\n"
+msgstr "%1$s 프린터 출력을 %3$s에 있는 %2$s 원격 프린터로 보냄\n"
msgid "Output for printer %s/%s is sent to %s\n"
msgstr "%s/%s 프린터 출력을 %s로 보냄\n"
msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
-msgstr "%s/%s 프린터 출력을 %s에 있는 %s 원격 프린터로 보냄\n"
+msgstr "%1$s/%2$s 프린터 출력을 %4$s에 있는 %3$s 원격 프린터로 보냄\n"
msgid "Output tray missing!"
msgstr "출력 트레이가 유실됨!"
msgid "PASS\n"
-msgstr "통과\n"
+msgstr "PASS\n"
msgid "PCL Laser Printer"
msgstr "PCL 레이저 프린터"
msgid "PRC1 Envelope"
msgid "ParamCustominTearInterval"
msgstr "ParamCustominTearInterval"
msgid "Password for %s on %s? "
-msgstr "%s 암호(%s에서 사용)? "
+msgstr "%2$s의 %1$s 암호? "
msgid "Password for %s required to access %s via SAMBA: "
-msgstr "%s에 대한 암호는 SAMBA를 통해 %s에 연결해야 합니다: "
+msgstr "SAMBA를 통해 %2$s에 연결하려면 필요한 %1$s의 암호: "
msgid "Pause Class"
msgstr "클래스 일시정지"
msgid "Pause Printer"
msgid "Rank Owner Job File(s) Total Size\n"
msgstr "단계 소유자 작업 파일 총 크기\n"
msgid "Rank Owner Pri Job Files Total Size\n"
-msgstr "단계 소유자 미리 작업 파일 총 크기\n"
+msgstr "단계 소유자 우선순위 작업 파일 총 크기\n"
msgid "Reject Jobs"
msgstr "작업 거부"
msgid "Reprint After Error"
msgid "Serial Port #%d"
msgstr "시리얼 포트 #%d"
msgid "Server Restarted"
-msgstr "ì\8b\9cë\8f\99ë\90\9c ì\84\9cë²\84"
+msgstr "ì\84\9cë²\84 ì\9e¬ì\8b\9cë\8f\99ë\90¨"
msgid "Server Security Auditing"
msgstr "서버 보안 감사"
msgid "Server Started"
-msgstr "ì\8b\9cì\9e\91í\95\9c ì\84\9cë²\84"
+msgstr "ì\84\9cë²\84 ì\8b\9cë\8f\99ë\90¨"
msgid "Server Stopped"
-msgstr "ì¤\91ë\8b¨ë\90\9c ì\84\9cë²\84"
+msgstr "ì\84\9cë²\84 ì¤\91ë\8b¨ë\90¨"
msgid "Service Unavailable"
msgstr "사용할 수 없는 서비스"
msgid "Set Allowed Users"
msgstr "허용된 사용자 설정"
msgid "Set As Server Default"
-msgstr "기본으로 설정"
+msgstr "서버 기본값으로 설정"
msgid "Set Class Options"
msgstr "클래스 옵션 설정"
msgid "Set Printer Options"
msgstr "프린터 옵션 설정"
msgid "Set Publishing"
-msgstr "발행하기 설정"
+msgstr "발행 설정"
msgid "Shipping Address"
msgstr "발송 주소"
msgid "Shipping Address - 2 5/16 x 4\""
msgid "Starting Banner"
msgstr "배너 시작 중"
msgid "Statement"
-msgstr "ì\83\81í\83\9c"
+msgstr "ë\8c\80ì°¨í\91\9c"
msgid "Stylus Color Series"
-msgstr "Stylus 색상 시리즈"
+msgstr "Stylus Color 시리즈"
msgid "Stylus Photo Series"
-msgstr "Stylus 사진 시리즈"
+msgstr "Stylus Photo 시리즈"
msgid "Super A"
msgstr "수퍼 A"
msgid "Super B"
msgid "The PPD file \"%s\" could not be found."
msgstr "\"%s\" PPD 파일을 찾을 수 없습니다."
msgid "The PPD file \"%s\" could not be opened: %s"
-msgstr "\"%s\" PPD 파일을 열 수 없습니다. %s"
+msgstr "\"%s\" PPD 파일을 열 수 없습니다: %s"
msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "í\81´ë\9e\98ì\8a¤ ì\9d´ë¦\84ì\9d\80 ìµ\9cë\8c\80 127ì\9e\90ì\9d\98 í\94\84린í\8a¸ ê°\80ë\8a¥í\95\9c 문ì\9e\90ë§\8cì\9d\84 í\8f¬í\95¨í\95 ì\88\98 ì\9e\88ê³ ë¹\88 칸, ì\8a¬ë\9e\98ì\8b\9c(/) ë\98\90ë\8a\94 í\8c\8cì\9a´ë\93\9c 기í\98¸(#)를 í\8f¬í\95¨í\95\98ì§\80 ì\95\8aì\9d\84 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤."
+msgstr "클래스 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않습니다."
msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
msgstr "notify-lease-duration 속성을 작업 구독과 함께 사용할 수 없습니다."
msgid "The notify-user-data value is too large (%d > 63 octets)!"
msgstr "notify-user-data 값이 너무 큼!(%d > 63행)!"
msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
-msgstr "í\94\84린í\84° ì\9d´ë¦\84ì\9d\80 ìµ\9cë\8c\80 127ì\9e\90ì\9d\98 í\94\84린í\8a¸ ê°\80ë\8a¥í\95\9c 문ì\9e\90ë§\8cì\9d\84 í\8f¬í\95¨í\95 ì\88\98 ì\9e\88ê³ ë¹\88 칸, ì\8a¬ë\9e\98ì\8b\9c(/) ë\98\90ë\8a\94 í\8c\8cì\9a´ë\93\9c 기í\98¸(#)를 í\8f¬í\95¨í\95\98ì§\80 ì\95\8aì\9d\84 ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤."
+msgstr "프린터 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않습니다."
msgid "The printer or class is not shared!"
msgstr "프린터 또는 클래스를 공유할 수 없음!"
msgid "The printer or class was not found."
msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
msgstr "printer-uri는 \"ipp://HOSTNAME/printers/PRINTERNAME\" 형태여야 합니다."
msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."
-msgstr "구독 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않을 수 있습니다."
+msgstr "구독 이름은 빈 칸, 슬래시(/), 물음표(?) 또는 파운드 기호(#)를 포함하지 않습니다."
msgid "There are too many subscriptions."
msgstr "구독이 너무 많습니다."
msgid "Thermal Transfer Media"
msgid "Toner low."
msgstr "토너가 부족합니다."
msgid "Too many active jobs."
-msgstr "너무 많은 작업이 활성되었습니다."
+msgstr "활성 작업이 너무 많습니다."
msgid "Too many job-sheets values (%d > 2)!"
msgstr "job-sheets 값이 너무 많습니다(%d > 2)!"
msgid "Too many printer-state-reasons values (%d > %d)!"
msgid "USB Serial Port #%d"
msgstr "USB 시리얼 포트 #%d"
msgid "Unable to access cupsd.conf file:"
-msgstr "cupsd.conf í\8c\8cì\9d¼ì\97\90 ì\97°ê²°í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "cupsd.conf í\8c\8cì\9d¼ì\97\90 ì\97°ê²°í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to add RSS subscription:"
-msgstr "RSS 구ë\8f\85ì\9d\84 ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "RSS 구ë\8f\85ì\9d\84 ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to add class:"
-msgstr "í\81´ë\9e\98ì\8a¤ë¥¼ ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\81´ë\9e\98ì\8a¤ë¥¼ ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to add job for destination \"%s\"!"
-msgstr "\"%s\" ë\8c\80ì\83\81ì\97\90 ë\8c\80í\95\9c ì\9e\91ì\97\85ì\9d\84 ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\9d\8c!"
+msgstr "\"%s\" ë\8c\80ì\83\81ì\97\90 ë\8c\80í\95\9c ì\9e\91ì\97\85ì\9d\84 ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤!"
msgid "Unable to add printer:"
-msgstr "í\94\84린í\84°ë¥¼ ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84°ë¥¼ ì¶\94ê°\80í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to allocate memory for file types!"
-msgstr "í\8c\8cì\9d¼ ì\9c í\98\95ì\97\90 ë\8c\80í\95\9c ë©\94모리를 í\95 ë\8b¹í\95 ì\88\98 ì\97\86ì\9d\8c!"
+msgstr "í\8c\8cì\9d¼ ì\9c í\98\95ì\97\90 ë\8c\80í\95\9c ë©\94모리를 í\95 ë\8b¹í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤!"
msgid "Unable to cancel RSS subscription:"
-msgstr "RSS 구독을 취소없습니다:"
+msgstr "RSS 구독을 취소할 수 없음:"
msgid "Unable to change printer-is-shared attribute:"
-msgstr "printer-is-shared ì\86\8dì\84±ì\9d\84 ë³\80ê²½í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "printer-is-shared ì\86\8dì\84±ì\9d\84 ë³\80ê²½í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to change printer:"
-msgstr "í\94\84린í\84°ë¥¼ ë³\80ê²½í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84°ë¥¼ ë³\80ê²½í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to change server settings:"
-msgstr "ì\84\9cë²\84 ì\84¤ì \95ê°\92ì\9d\84 ë³\80ê²½í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "ì\84\9cë²\84 ì\84¤ì \95ê°\92ì\9d\84 ë³\80ê²½í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to connect to host."
-msgstr "í\98¸ì\8a¤í\8a¸ì\97\90 ì\97°ê²°í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤."
+msgstr "í\98¸ì\8a¤í\8a¸ì\97\90 ì\97°ê²°í\95 ì\88\98 ì\97\86ì\9d\8c."
msgid "Unable to copy 64-bit CUPS printer driver files (%d)!"
-msgstr "64ë¹\84í\8a¸ CUPS í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\9d\8c(%d)!"
+msgstr "64ë¹\84í\8a¸ CUPS í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤(%d)!"
msgid "Unable to copy 64-bit Windows printer driver files (%d)!"
-msgstr "64ë¹\84í\8a¸ Windows í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\9d\8c(%d)!"
+msgstr "64ë¹\84í\8a¸ Windows í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤(%d)!"
msgid "Unable to copy CUPS printer driver files (%d)!"
-msgstr "CUPS í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\9d\8c(%d)!"
+msgstr "CUPS í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤(%d)!"
msgid "Unable to copy PPD file - %s!"
msgstr "PPD 파일을 복사할 수 없음 - %s!"
msgid "Unable to copy PPD file!"
-msgstr "PPD í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\9d\8c!"
+msgstr "PPD í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤!"
msgid "Unable to copy Windows 2000 printer driver files (%d)!"
-msgstr "Windows 2000 í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\9d\8c(%d)!"
+msgstr "Windows 2000 í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤(%d)!"
msgid "Unable to copy Windows 9x printer driver files (%d)!"
-msgstr "Windows 9x í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\9d\8c(%d)!"
+msgstr "Windows 9x í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 í\8c\8cì\9d¼ì\9d\84 ë³µì\82¬í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤(%d)!"
msgid "Unable to copy interface script - %s!"
msgstr "인터페이스 스크립트를 복사할 수 없음 - %s!"
msgid "Unable to create printer-uri!"
-msgstr "printer-uri를 ì\83\9dì\84±í\95 ì\88\98 ì\97\86ì\9d\8c!"
+msgstr "printer-uri를 ì\83\9dì\84±í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤!"
msgid "Unable to create temporary file:"
-msgstr "ì\9e\84ì\8b\9c í\8c\8cì\9d¼ì\9d\84 ì\83\9dì\84±í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "ì\9e\84ì\8b\9c í\8c\8cì\9d¼ì\9d\84 ì\83\9dì\84±í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to delete class:"
-msgstr "í\81´ë\9e\98ì\8a¤ë¥¼ ì\82ì \9cí\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\81´ë\9e\98ì\8a¤ë¥¼ ì\82ì \9cí\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to delete printer:"
-msgstr "í\94\84린í\84°ë¥¼ ì\82ì \9cí\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84°ë¥¼ ì\82ì \9cí\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to do maintenance command:"
-msgstr "ëª\85ë ¹ì\9d\84 ì\9c ì§\80í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "ëª\85ë ¹ì\9d\84 ì\9c ì§\80í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to edit cupsd.conf files larger than 1MB!"
msgstr "1MB보다 큰 cupsd.conf 파일은 편집할 수 없습니다!"
msgid "Unable to find destination for job!"
msgid "Unable to find printer!\n"
msgstr "프린터를 찾을 수 없습니다!\n"
msgid "Unable to get class list:"
-msgstr "í\81´ë\9e\98ì\8a¤ 목ë¡\9dì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\81´ë\9e\98ì\8a¤ 목ë¡\9dì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to get class status:"
-msgstr "í\81´ë\9e\98ì\8a¤ ì\83\81í\83\9c를 ì\95\8c ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\81´ë\9e\98ì\8a¤ ì\83\81í\83\9c를 ì\95\8c ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to get list of printer drivers:"
-msgstr "í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 목ë¡\9dì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84 목ë¡\9dì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to get printer attributes:"
-msgstr "í\94\84린í\84° ì\86\8dì\84±ì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84° ì\86\8dì\84±ì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to get printer list:"
-msgstr "í\94\84린í\84° 목ë¡\9dì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84° 목ë¡\9dì\9d\84 ì\96»ì\9d\84 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to get printer status:"
msgstr "프린터 상태를 알 수 없습니다:"
msgid "Unable to install Windows 2000 printer driver files (%d)!"
msgid "Unable to install Windows 9x printer driver files (%d)!"
msgstr "Windows 9x 프린터 드라이버 파일을 설치할 수 없습니다(%d)!"
msgid "Unable to modify class:"
-msgstr "í\81´ë\9e\98ì\8a¤ë¥¼ ì\88\98ì \95í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\81´ë\9e\98ì\8a¤ë¥¼ ì\88\98ì \95í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to modify printer:"
-msgstr "í\94\84린í\84°ë¥¼ ì\88\98ì \95í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\94\84린í\84°ë¥¼ ì\88\98ì \95í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to move job"
msgstr "작업을 이동할 수 없습니다"
msgid "Unable to move jobs"
msgid "Unable to open PPD file"
msgstr "PPD 파일을 열 수 없습니다"
msgid "Unable to open PPD file:"
-msgstr "PPD í\8c\8cì\9d¼ì\9d\84 ì\97´ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "PPD í\8c\8cì\9d¼ì\9d\84 ì\97´ ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to open cupsd.conf file:"
-msgstr "cupsd.conf í\8c\8cì\9d¼ì\9d\84 ì\97´ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "cupsd.conf í\8c\8cì\9d¼ì\9d\84 ì\97´ ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to open document %d in job %d!"
-msgstr "%d개의 도큐멘트를 작업 %d에서 열 수 없습니다!"
+msgstr "도큐멘트 %d을(를) 작업 %d에서 열 수 없습니다!"
msgid "Unable to print test page:"
-msgstr "í\85\8cì\8a¤í\8a¸ í\8e\98ì\9d´ì§\80를 í\94\84린í\8a¸í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "í\85\8cì\8a¤í\8a¸ í\8e\98ì\9d´ì§\80를 í\94\84린í\8a¸í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to run \"%s\": %s\n"
-msgstr "\"%s\"ì\9d\84(를) ì\8b¤í\96\89í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤: %s\n"
+msgstr "\"%s\"ì\9d\84(를) ì\8b¤í\96\89í\95 ì\88\98 ì\97\86ì\9d\8c: %s\n"
msgid "Unable to send command to printer driver!"
-msgstr "í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84ë¡\9c ëª\85ë ¹ì\9d\84 ë³´ë\82¼ ì\88\98 ì\97\86ì\9d\8c!"
+msgstr "í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84ë¡\9c ëª\85ë ¹ì\9d\84 ë³´ë\82¼ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤!"
msgid "Unable to set Windows printer driver (%d)!"
-msgstr "Windows í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84를 ì\84¤ì \95í\95 ì\88\98 ì\97\86ì\9d\8c(%d)!"
+msgstr "Windows í\94\84린í\84° ë\93\9cë\9d¼ì\9d´ë²\84를 ì\84¤ì \95í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤(%d)!"
msgid "Unable to set options:"
-msgstr "ì\98µì\85\98ì\9d\84 ì\84¤ì \95í\95 ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤:"
+msgstr "ì\98µì\85\98ì\9d\84 ì\84¤ì \95í\95 ì\88\98 ì\97\86ì\9d\8c:"
msgid "Unable to set server default:"
-msgstr "기본 서버를 설정할 수 없습니다:"
+msgstr "서버 기본값을 설정할 수 없음:"
msgid "Unable to upload cupsd.conf file:"
msgstr "cupsd.conf 파일을 업로드할 수 없습니다:"
msgid "Unable to use legacy USB class driver!\n"
msgid "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n"
msgstr "사용법:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n"
msgid "Usage: %s job user title copies options [filename]\n"
-msgstr "사용법: %s 작업 사용자 제목 복사 옵션 [파일 이름]\n"
+msgstr "사용법: %s job user title copies options [filename]\n"
msgid "Usage: %s job-id user title copies options [file]\n"
-msgstr "사용법: %s job-id 사용자 제목 복사 옵션 [파일]\n"
+msgstr "사용법: %s job-id user title copies options [file]\n"
msgid "Usage: %s job-id user title copies options file\n"
-msgstr "사용법: %s job-id 사용자 제목 복사 옵션 파일\n"
+msgstr "사용법: %s job-id user title copies options file\n"
msgid "Usage: convert [ options ]\n\nOptions:\n\n -f filename Set file to be converted (otherwise stdin)\n -o filename Set file to be generated (otherwise stdout)\n -i mime/type Set input MIME type (otherwise auto-typed)\n -j mime/type Set output MIME type (otherwise application/pdf)\n -P filename.ppd Set PPD file\n -a 'name=value ...' Set option(s)\n -U username Set username for job\n -J title Set title\n -c copies Set number of copies\n -u Remove the PPD file when finished\n -D Remove the input file when finished\n"
msgstr "사용법: convert [ options ]\n\n옵션:\n\n -f filename 변환할 파일 설정(또는 stdin)\n -o filename 생성할 파일 설정(또는 stdout)\n -i mime/type 입력 MIME 유형 설정(또는 자동 유형 설정)\n -j mime/type 출력 MIME 유형 설정(또는 응용 프로그램/pdf)\n -P filename.ppd PPD 파일 설정\n -a 'name=value ...' 옵션 설정(s)\n -U username 작업에 대한 사용자 이름 설정\n -J title 제목 설정\n -c copies 복사 장 수 설정\n -u 종료 시 PPD 파일 제거\n -D 종료 시 입력 파일 제거\n"
msgid "Usage: cupsaddsmb [options] printer1 ... printerN\n cupsaddsmb [options] -a\n\nOptions:\n -E Encrypt the connection to the server\n -H samba-server Use the named SAMBA server\n -U samba-user Authenticate using the named SAMBA user\n -a Export all printers\n -h cups-server Use the named CUPS server\n -v Be verbose (show commands)\n"
msgid "WARNING: Unable to send PAP status request"
msgstr "WARNING: PAP 상태 요청을 보낼 수 없습니다"
msgid "WARNING: Unexpected PAP packet of type %d\n"
-msgstr "WARNING: %d 유형의 예기치않은 PAP 패킷\n"
+msgstr "WARNING: %d 유형의 예기치 않은 PAP 패킷\n"
msgid "WARNING: Unknown PAP packet of type %d\n"
msgstr "WARNING: %d 유형의 알 수 없는 PAP 패킷\n"
msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n"
-msgstr "WARNING: \"%s\" 옵션에 대한 알 수 없는 선택 \"%s\"!\n"
+msgstr "WARNING: \"%2$s\" 옵션에 대한 알 수 없는 \"%1$s\" 선택사항!\n"
msgid "WARNING: Unknown option \"%s\"!\n"
msgstr "WARNING: 알 수 없는 \"%s\" 옵션!\n"
msgid "WARNING: Unsupported baud rate %s!\n"
msgid "device for %s: %s\n"
msgstr "%s에 대한 장비: %s\n"
msgid "error-index uses indefinite length"
-msgstr "오류-인덱스 길이가 무제한입니다"
+msgstr "error-index 길이가 무제한입니다"
msgid "error-status uses indefinite length"
-msgstr "오류-상태 길이가 무제한입니다"
+msgstr "error-status 길이가 무제한입니다"
msgid "held"
msgstr "유지됨"
msgid "help\t\tget help on commands\n"
msgid "lpadmin: Class name can only contain printable characters!\n"
msgstr "lpadmin: 클래스 이름은 프린트 가능한 문자만 포함할 수 있음!\n"
msgid "lpadmin: Expected PPD after '-P' option!\n"
-msgstr "lpadmin: '-P'옵션 뒤에 PPD가 예상됨!\n"
+msgstr "lpadmin: '-P' 옵션 뒤에 PPD가 예상됨!\n"
msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n"
-msgstr "lpadmin: '-u'옵션 뒤에 허용/거부:사용자목록이 예상됨!\n"
+msgstr "lpadmin: '-u' 옵션 뒤에 allow/deny:userlist가 예상됨!\n"
msgid "lpadmin: Expected class after '-r' option!\n"
-msgstr "lpadmin: '-r'옵션 뒤에 클래스가 예상됨!\n"
+msgstr "lpadmin: '-r' 옵션 뒤에 클래스가 예상됨!\n"
msgid "lpadmin: Expected class name after '-c' option!\n"
-msgstr "lpadmin: '-c'옵션 뒤에 클래스 이름이 예상됨!\n"
+msgstr "lpadmin: '-c' 옵션 뒤에 클래스 이름이 예상됨!\n"
msgid "lpadmin: Expected description after '-D' option!\n"
-msgstr "lpadmin: '-D'옵션 뒤에 설명이 예상됨!\n"
+msgstr "lpadmin: '-D' 옵션 뒤에 설명이 예상됨!\n"
msgid "lpadmin: Expected device URI after '-v' option!\n"
-msgstr "lpadmin: '-v'옵션 뒤에 장비 URI가 예상됨!\n"
+msgstr "lpadmin: '-v' 옵션 뒤에 장비 URI가 예상됨!\n"
msgid "lpadmin: Expected file type(s) after '-I' option!\n"
-msgstr "lpadmin: '-I'옵션 뒤에 파일 유형이 예상됨!\n"
+msgstr "lpadmin: '-I' 옵션 뒤에 파일 유형이 예상됨!\n"
msgid "lpadmin: Expected hostname after '-h' option!\n"
-msgstr "lpadmin: '-h'옵션 뒤에 호스트 이름이 예상됨!\n"
+msgstr "lpadmin: '-h' 옵션 뒤에 호스트 이름이 예상됨!\n"
msgid "lpadmin: Expected interface after '-i' option!\n"
-msgstr "lpadmin: '-i'옵션 뒤에 인터페이스가 예상됨!\n"
+msgstr "lpadmin: '-i' 옵션 뒤에 인터페이스가 예상됨!\n"
msgid "lpadmin: Expected location after '-L' option!\n"
-msgstr "lpadmin: '-L'옵션 뒤에 위치가 예상됨!\n"
+msgstr "lpadmin: '-L' 옵션 뒤에 위치가 예상됨!\n"
msgid "lpadmin: Expected model after '-m' option!\n"
-msgstr "lpadmin: '-m'옵션 뒤에 모델이 예상됨!\n"
+msgstr "lpadmin: '-m' 옵션 뒤에 모델이 예상됨!\n"
msgid "lpadmin: Expected name=value after '-o' option!\n"
-msgstr "lpadmin: '-o'옵션 뒤에 이름=값이 예상됨!\n"
+msgstr "lpadmin: '-o' 옵션 뒤에 name=value가 예상됨!\n"
msgid "lpadmin: Expected printer after '-p' option!\n"
-msgstr "lpadmin: '-p'옵션 뒤에 프린터가 예상됨!\n"
+msgstr "lpadmin: '-p' 옵션 뒤에 프린터가 예상됨!\n"
msgid "lpadmin: Expected printer name after '-d' option!\n"
-msgstr "lpadmin: '-d'옵션 뒤에 프린터가 예상됨!\n"
+msgstr "lpadmin: '-d' 옵션 뒤에 프린터 이름이 예상됨!\n"
msgid "lpadmin: Expected printer or class after '-x' option!\n"
-msgstr "lpadmin: '-x'옵션 뒤에 프린터 또는 클래스가 예상됨!\n"
+msgstr "lpadmin: '-x' 옵션 뒤에 프린터 또는 클래스가 예상됨!\n"
msgid "lpadmin: No member names were seen!\n"
-msgstr "lpadmin: 보이는 회원 이름이 없음!\n"
+msgstr "lpadmin: 회원 이름이 보이지 않음!\n"
msgid "lpadmin: Printer %s is already a member of class %s.\n"
msgstr "lpadmin: %s 프린터에 이미 %s 클래스 회원이 있습니다.\n"
msgid "lpadmin: Printer %s is not a member of class %s.\n"
msgid "lpadmin: Unable to set the printer options:\n You must specify a printer name first!\n"
msgstr "lpadmin: 프린터 옵션을 설정할 수 없음:\n 먼저 프린터 이름을 지정해야 합니다!\n"
msgid "lpadmin: Unknown allow/deny option \"%s\"!\n"
-msgstr "lpadmin: 알 수 없는 \"%s\" 허용/거부 옵션!\n"
+msgstr "lpadmin: 알 수 없는 allow/deny 옵션 \"%s\"!\n"
msgid "lpadmin: Unknown argument '%s'!\n"
msgstr "lpadmin: 알 수 없는 '%s' 변수!\n"
msgid "lpadmin: Unknown option '%c'!\n"
msgid "lpinfo: Expected language after --language!\n"
msgstr "lpinfo: --language 뒤에 언어가 예상됨!\n"
msgid "lpinfo: Expected make and model after --make-and-model!\n"
-msgstr "lpinfo: --make-and-model ë\92¤ì\97\90 ì\83\9dì\84± 및 모델이 예상됨!\n"
+msgstr "lpinfo: --make-and-model ë\92¤ì\97\90 ì \9cì¡°ì\82¬ 및 모델이 예상됨!\n"
msgid "lpinfo: Expected product string after --product!\n"
msgstr "lpinfo: --product 뒤에 제품 스트링이 예상됨!\n"
msgid "lpinfo: Expected scheme list after --exclude-schemes!\n"
msgid "lpoptions: Unknown printer or class!\n"
msgstr "lpoptions: 알 수 없는 프린터 또는 클래스!\n"
msgid "lppasswd: Only root can add or delete passwords!\n"
-msgstr "lppasswd: 루트만 암호를 추가 또는 제거할 수 있음!\n"
+msgstr "lppasswd: root만 암호를 추가 또는 제거할 수 있음!\n"
msgid "lppasswd: Password file busy!\n"
msgstr "lppasswd: 암호 파일 사용 중!\n"
msgid "lppasswd: Password file not updated!\n"
msgid "lppasswd: Sorry, password doesn't match!\n"
msgstr "lppasswd: 죄송합니다, 암호가 일치하지 않습니다!\n"
msgid "lppasswd: Sorry, password rejected.\nYour password must be at least 6 characters long, cannot contain\nyour username, and must contain at least one letter and number.\n"
-msgstr "lppasswd: 죄송합니다, 암호가 거부되었습니다.\n암호는 최소한 6자 이상이어야 하고, 사용자 이름을 포함해서는 안되며, 최소 하나 이상의 문자 및 숫자를 포함해야 합니다.\n"
+msgstr "lppasswd: 죄송합니다, 암호가 거부되었습니다.\n암호는 최소한 6자 이상이어야 하고, 사용자 이름을 포함해서는 안되며, \n최소 하나 이상의 문자 및 숫자를 포함해야 합니다.\n"
msgid "lppasswd: Sorry, passwords don't match!\n"
msgstr "lppasswd: 죄송합니다, 암호가 일치하지 않습니다!\n"
msgid "lppasswd: Unable to copy password string: %s\n"
msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
msgstr "lpstat: 오류 - %s 환경 변수 이름이 존재하지 않는 대상 \"%s\" 이름임!\n"
msgid "members of class %s:\n"
-msgstr "클래스 회원 %s:\n"
+msgstr "%s 클래스 회원:\n"
msgid "no entries\n"
msgstr "엔트리 없음\n"
msgid "no system default destination\n"
msgid "ppdc: Adding/updating UI text from %s...\n"
msgstr "ppdc: %s에서 UI 텍스트 추가/업데이트 중...\n"
msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n"
-msgstr "ppdc: 잘못된 불리언 값(%1$s)이(가) %3$s의 %2$d번째 줄에 있음.\n"
+msgstr "ppdc: 잘못된 불리언 값(%1$s)이 %3$s의 %2$d번째 줄에 있음.\n"
msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n"
msgstr "ppdc: 잘못된 \"%1$s\" 해상도 이름이 %3$s의 %2$d번째 줄에 있음!\n"
msgid "ppdc: Bad status keyword %s on line %d of %s!\n"
msgid "ppdc: Expected boolean value on line %d of %s.\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 불리언 값이 예상됨.\n"
msgid "ppdc: Expected charset after Font on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄에 Font 뒤에 문자 세트가 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 문자 세트가 예상됨!\n"
msgid "ppdc: Expected choice code on line %d of %s.\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 선택사항 코드가 예상됨.\n"
msgid "ppdc: Expected choice name/text on line %d of %s.\n"
msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 색상 순서가 예상됨!\n"
msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n"
-msgstr "ppdc: %2$sì\9d\98 %1$dë²\88째 ì¤\84ì\97\90 ColorModelì\97\90 ë\8c\80í\95´ 색상 공간이 예상됨!\n"
+msgstr "ppdc: %2$sì\9d\98 %1$dë²\88째 ì¤\84ì\97\90 ColorModelì\97\90 ë\8c\80í\95\9c 색상 공간이 예상됨!\n"
msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n"
-msgstr "ppdc: %2$sì\9d\98 %1$dë²\88째 ì¤\84ì\97\90 ColorModelì\97\90 ë\8c\80í\95´ 압축이 예상됨!\n"
+msgstr "ppdc: %2$sì\9d\98 %1$dë²\88째 ì¤\84ì\97\90 ColorModelì\97\90 ë\8c\80í\95\9c 압축이 예상됨!\n"
msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n"
-msgstr "ppdc: %2$sì\9d\98 %1$dë²\88째 ì¤\84ì\97\90 UIConstraintsì\97\90 ë\8c\80í\95´ 제한 스트링이 예상됨!\n"
+msgstr "ppdc: %2$sì\9d\98 %1$dë²\88째 ì¤\84ì\97\90 UIConstraintsì\97\90 ë\8c\80í\95\9c 제한 스트링이 예상됨!\n"
msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 DriverType 뒤에 드라이버 유형 키워드가 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, DriverType 뒤에 드라이버 유형 키워드가 예상됨!\n"
msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Duplex 뒤에 양면 유형이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Duplex 뒤에 양면 유형이 예상됨!\n"
msgid "ppdc: Expected encoding after Font on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 인코딩이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 인코딩이 예상됨!\n"
msgid "ppdc: Expected filename after #po %s on line %d of %s!\n"
-msgstr "ppdc: #po %1$s 뒤에 파일 이름이 예상됨(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄, #po %1$s 뒤에 파일 이름이 예상됨!\n"
msgid "ppdc: Expected group name/text on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 그룹 이름/텍스트가 예상됨!\n"
msgid "ppdc: Expected include filename on line %d of %s!\n"
msgid "ppdc: Expected integer on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 정수가 예상됨!\n"
msgid "ppdc: Expected locale after #po on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 #po 뒤에 로컬 위치가 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, #po 뒤에 로컬 위치가 예상됨!\n"
msgid "ppdc: Expected name after %s on line %d of %s!\n"
-msgstr "ppdc: %1$s 뒤에 이름이 예상됨(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name after FileName on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 FileName 뒤에 이름이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, FileName 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name after Font on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 이름이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Manufacturer 뒤에 이름이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Manufacturer 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name after MediaSize on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 MediaSize 뒤에 이름이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, MediaSize 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name after ModelName on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 ModelName 뒤에 이름이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, ModelName 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name after PCFileName on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 PCFileName 뒤에 이름이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, PCFileName 뒤에 이름이 예상됨!\n"
msgid "ppdc: Expected name/text after %s on line %d of %s!\n"
-msgstr "ppdc: %1$s 뒤에 이름/텍스트가 예상됨(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 이름/텍스트가 예상됨!\n"
msgid "ppdc: Expected name/text after Installable on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Installable 뒤에 이름/텍스트 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Installable 뒤에 이름/텍스트 예상됨!\n"
msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Resolution 뒤에 이름/텍스트 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Resolution 뒤에 이름/텍스트 예상됨!\n"
msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 ColorModel에 대해 이름/텍스트 조합이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, ColorModel에 대해 이름/텍스트 조합이 예상됨!\n"
msgid "ppdc: Expected option name/text on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 이름/텍스트가 예상됨!\n"
msgid "ppdc: Expected option section on line %d of %s!\n"
msgid "ppdc: Expected option type on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄의 옵션 유형이 예상됨!\n"
msgid "ppdc: Expected override field after Resolution on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Resolution 뒤에 오버라이드 필드가 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Resolution 뒤에 오버라이드 필드가 예상됨!\n"
msgid "ppdc: Expected real number on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 실제 번호가 예상됨!\n"
msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 ColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, ColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n"
msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 SimpleColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, SimpleColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n"
msgid "ppdc: Expected selector after %s on line %d of %s!\n"
-msgstr "ppdc: %1$s 뒤에 선택자가 예상됨(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 선택자가 예상됨!\n"
msgid "ppdc: Expected status after Font on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 상태가 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 상태가 예상됨!\n"
msgid "ppdc: Expected string after Copyright on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Copyright 뒤에 스트링이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Copyright 뒤에 스트링이 예상됨!\n"
msgid "ppdc: Expected string after Version on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Version 뒤에 스트링이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Version 뒤에 스트링이 예상됨!\n"
msgid "ppdc: Expected two option names on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 이름 2개가 예상됨!\n"
msgid "ppdc: Expected value after %s on line %d of %s!\n"
-msgstr "ppdc: %1$s 뒤에 값이 예상됨(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 값이 예상됨!\n"
msgid "ppdc: Expected version after Font on line %d of %s!\n"
-msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 버전이 예상됨!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 버전이 예상됨!\n"
msgid "ppdc: Invalid #include/#po filename \"%s\"!\n"
msgstr "ppdc: 유효하지 않은 #include/#po 파일 이름 \"%s\"!\n"
msgid "ppdc: Invalid cost for filter on line %d of %s!\n"
msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄의 필터에 대해 유효하지 않은 빈 프로그램 이름!\n"
msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n"
-msgstr "ppdc: 유효하지 않은 \"%1$s\"옵션 섹션(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 유효하지 않은 \"%1$s\" 옵션 섹션!\n"
msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n"
-msgstr "ppdc: 유효하지 않은 \"%1$s\ 옵션 유형(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 유효하지 않은 \"%1$s\ 옵션 유형!\n"
msgid "ppdc: Loading driver information file \"%s\"...\n"
msgstr "ppdc: \"%s\" 드라이버 정보 파일 로드 중...\n"
msgid "ppdc: Loading messages for locale \"%s\"...\n"
msgid "ppdc: No message catalog provided for locale %s!\n"
msgstr "ppdc: 로컬 %s에 대해 제공된 메시지 카탈로그 없음!\n"
msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n"
-msgstr "ppdc: %1$s 옵션이 다른 유형으로 재정의됨(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 %1$s 옵션이 다른 유형으로 재정의됨!\n"
msgid "ppdc: Option constraint must *name on line %d of %s!\n"
-msgstr "ppdc: 옵션 제한은 *name이어야 함(%2$s의 %1$d번째 줄)!\n"
+msgstr "ppdc: %2$s의 %1$d번째 줄에 있는 옵션 제한은 *name이어야 함!\n"
msgid "ppdc: Too many nested #if's on line %d of %s!\n"
msgstr "ppdc: %2$s의 %1$d번째 줄에 너무 많이 중첩된 #if가 있음!\n"
msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n"
msgid "ppdc: Unable to execute cupstestppd: %s\n"
msgstr "ppdc: cupstestppd를 실행할 수 없음: %s\n"
msgid "ppdc: Unable to find #po file %s on line %d of %s!\n"
-msgstr "ppdc: #po 파일 %1$s을(를) 찾을 수 없음(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에서 #po 파일 %1$s을(를) 찾을 수 없음!\n"
msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n"
-msgstr "ppdc: \"%1$s\" 포함 파일을 찾을 수 없음(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에서 포함 파일 \"%1$s\"을(를) 찾을 수 없음!\n"
msgid "ppdc: Unable to find localization for \"%s\" - %s\n"
msgstr "ppdc: \"%s\"에 대한 현지화를 찾을 수 없음 - %s\n"
msgid "ppdc: Unable to load localization file \"%s\" - %s\n"
msgstr "ppdc: \"%s\"에 대한 현지화 파일을 로드할 수 없음 - %s\n"
msgid "ppdc: Undefined variable (%s) on line %d of %s.\n"
-msgstr "ppdc: 변수(%1$s)가 정의되지 않음(%3$s의 %2$d번째 줄).\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 변수(%1$s)가 정의되지 않음.\n"
msgid "ppdc: Unknown driver type %s on line %d of %s!\n"
-msgstr "ppdc: 알 수 없는 %1$s 드라이브 유형(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 %1$s 드라이브 유형!\n"
msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n"
-msgstr "ppdc: 알 수 없는 \"%1$s\" 양면 유형(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 \"%1$s\" 양면 유형!\n"
msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n"
-msgstr "ppdc: 알 수 없는 \"%1$s\" 미디어 크기(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 \"%1$s\" 미디어 크기!\n"
msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n"
-msgstr "ppdc: 알 수 없는 \"%1$s\" 토큰(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 보이는 알 수 없는 \"%1$s\" 토큰!\n"
msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n"
-msgstr "ppdc: 실수에 \"%1$s\" 알 수 없는 마지막 문자(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 있는 \"%1$s\" 실수에 알 수 없는 마지막 문자!\n"
msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n"
-msgstr "ppdc: %1$c(으)로 시작하는 끝나지 않는 스트링(%3$s의 %2$d번째 줄)!\n"
+msgstr "ppdc: %3$s의 %2$d번째 줄에 %1$c(으)로 시작하는 끝나지 않는 스트링!\n"
msgid "ppdc: Writing %s...\n"
msgstr "ppdc: %s 쓰는 중...\n"
msgid "ppdc: Writing PPD files to directory \"%s\"...\n"
msgstr "ppdc: \"%s\" 디렉토리에 PPD 파일 쓰는 중...\n"
msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n"
-msgstr "ppdmerge: 잘못된 \"%s\" LanguageVersion(%s에 있음)!\n"
+msgstr "ppdmerge: %2$s에 잘못된 \"%1$s\" LanguageVersion!\n"
msgid "ppdmerge: Ignoring PPD file %s...\n"
msgstr "ppdmerge: %s PPD 파일 무시 중...\n"
msgid "ppdmerge: Unable to backup %s to %s- %s\n"
msgstr "ppdmerge: %s을(를) %s(으)로 백업할 수 없음- %s\n"
msgid "printer %s disabled since %s -\n"
-msgstr "%s 프린터가 비활성화됨(%s 이후) -\n"
+msgstr "%2$s 이후로 %1$s 프린터가 비활성화됨 -\n"
msgid "printer %s is idle. enabled since %s\n"
-msgstr "%s 프린터가 대기 중. %s 이후에 활성화됨\n"
+msgstr "%s 프린터가 대기 중. %s 이후에 활성화됨\n"
msgid "printer %s now printing %s-%d. enabled since %s\n"
msgstr "%s 프린터가 현재 %s-%d을(를) 프린트 중입니다. %s 이후에 활성화됨\n"
msgid "printer %s/%s disabled since %s -\n"
msgid "processing"
msgstr "처리 중"
msgid "request id is %s-%d (%d file(s))\n"
-msgstr "id 요청은 %s-%d(%d개의 파일)\n"
+msgstr "요청 id는 %s-%d(%d개의 파일)\n"
msgid "request-id uses indefinite length"
-msgstr "id 요청은 길이가 무제한입니다"
+msgstr "request-id 길이가 무제한입니다"
msgid "scheduler is not running\n"
msgstr "일정이 실행되지 않음\n"
msgid "scheduler is running\n"
msgstr "일정이 실행 중\n"
msgid "stat of %s failed: %s"
-msgstr "%s 시작에 실패함: %s"
+msgstr "%s 통계에 실패함: %s"
msgid "status\t\tshow status of daemon and queue\n"
msgstr "상태\t\t데몬 및 대기열 상태 보기\n"
msgid "stopped"
msgid "untitled"
msgstr "무제"
msgid "variable-bindings uses indefinite length"
-msgstr "variable-bindings는 길이가 무제한입니다"
+msgstr "variable-bindings의 길이가 무제한입니다"
#d 0755 root sys $DATADIR/templates/it
#f 0644 root sys $DATADIR/templates/it templates/it/*.tmpl
-#d 0755 root sys $DATADIR/templates/ja
-#f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl
+d 0755 root sys $DATADIR/templates/ja
+f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl
-#d 0755 root sys $DATADIR/templates/pl
-#f 0644 root sys $DATADIR/templates/pl templates/pl/*.tmpl
+d 0755 root sys $DATADIR/templates/pl
+f 0644 root sys $DATADIR/templates/pl templates/pl/*.tmpl
+
+d 0755 root sys $DATADIR/templates/ru
+f 0644 root sys $DATADIR/templates/ru templates/ru/*.tmpl
#d 0755 root sys $DATADIR/templates/sv
#f 0644 root sys $DATADIR/templates/sv templates/sv/*.tmpl
#d 0755 root sys $DOCDIR/it
#f 0644 root sys $DOCDIR/it doc/it/*.html
-#d 0755 root sys $DOCDIR/ja
-#f 0644 root sys $DOCDIR/ja doc/ja/*.html
+d 0755 root sys $DOCDIR/ja
+f 0644 root sys $DOCDIR/ja doc/ja/*.html
+
+d 0755 root sys $DOCDIR/pl
+f 0644 root sys $DOCDIR/pl doc/pl/*.html
-#d 0755 root sys $DOCDIR/pl
-#f 0644 root sys $DOCDIR/pl doc/pl/*.html
+d 0755 root sys $DOCDIR/ru
+f 0644 root sys $DOCDIR/ru doc/ru/*.html
#d 0755 root sys $DOCDIR/sv
#f 0644 root sys $DOCDIR/sv doc/sv/*.html
/usr/share/doc/cups/*.*
%dir /usr/share/doc/cups/es
/usr/share/doc/cups/es/*
+%dir /usr/share/doc/cups/ja
+/usr/share/doc/cups/ja/*
+%dir /usr/share/doc/cups/pl
+/usr/share/doc/cups/pl/*
+%dir /usr/share/doc/cups/ru
+/usr/share/doc/cups/ru/*
%dir /usr/share/doc/cups/help
/usr/share/doc/cups/help/accounting.html
/usr/share/doc/cups/help/cgi.html
cupsfilter.o: ../cups/file.h ../cups/language.h ../cups/i18n.h
cupsfilter.o: ../cups/transcode.h ../cups/string.h ../config.h mime.h
cupsfilter.o: ../cups/array.h ../cups/ipp.h ../cups/file.h
-cups-deviced.o: util.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
-cups-deviced.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h
-cups-deviced.o: ../cups/file.h ../cups/language.h ../cups/file.h
-cups-deviced.o: ../cups/string.h ../config.h ../cups/array.h ../cups/dir.h
+cups-deviced.o: util.h ../cups/file-private.h ../cups/http-private.h
+cups-deviced.o: ../config.h ../cups/http.h ../cups/versioning.h ../cups/md5.h
+cups-deviced.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/globals.h
+cups-deviced.o: ../cups/string.h ../cups/cups.h ../cups/i18n.h
+cups-deviced.o: ../cups/transcode.h ../cups/language.h ../cups/array.h
+cups-deviced.o: ../cups/debug.h ../cups/array.h ../cups/dir.h
cups-lpd.o: ../cups/http-private.h ../config.h ../cups/http.h
cups-lpd.o: ../cups/versioning.h ../cups/md5.h ../cups/ipp-private.h
cups-lpd.o: ../cups/ipp.h ../cups/cups.h ../cups/ppd.h ../cups/array.h
testsub.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/versioning.h
testsub.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
testsub.o: ../cups/debug.h ../cups/string.h ../config.h
-util.o: util.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
-util.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h ../cups/file.h
-util.o: ../cups/language.h ../cups/file.h ../cups/string.h ../config.h
-cups-driverd.o: util.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
-cups-driverd.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h
-cups-driverd.o: ../cups/file.h ../cups/language.h ../cups/file.h
-cups-driverd.o: ../cups/string.h ../config.h ../cups/dir.h
-cups-driverd.o: ../cups/transcode.h ../cups/ppd-private.h ../cups/cups.h
-cups-driverd.o: ../ppdc/ppdc.h
+util.o: util.h ../cups/file-private.h ../cups/http-private.h ../config.h
+util.o: ../cups/http.h ../cups/versioning.h ../cups/md5.h
+util.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/globals.h
+util.o: ../cups/string.h ../cups/cups.h ../cups/i18n.h ../cups/transcode.h
+util.o: ../cups/language.h ../cups/array.h ../cups/debug.h
+cups-driverd.o: util.h ../cups/file-private.h ../cups/http-private.h
+cups-driverd.o: ../config.h ../cups/http.h ../cups/versioning.h ../cups/md5.h
+cups-driverd.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/globals.h
+cups-driverd.o: ../cups/string.h ../cups/cups.h ../cups/i18n.h
+cups-driverd.o: ../cups/transcode.h ../cups/language.h ../cups/array.h
+cups-driverd.o: ../cups/debug.h ../cups/dir.h ../cups/transcode.h
+cups-driverd.o: ../cups/ppd-private.h ../ppdc/ppdc.h ../cups/string.h
+cups-driverd.o: ../cups/file.h
* Authentication certificate routines for the Common UNIX
* Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddCert: adding certificate for pid %d", pid);
+ "cupsdAddCert: Adding certificate for PID %d", pid);
/*
* Allocate memory for the certificate...
if ((fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0400)) < 0)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "cupsdAddCert: Unable to create certificate file %s - %s",
+ "Unable to create certificate file %s - %s",
filename, strerror(errno));
free(cert);
return;
*/
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDeleteCert: removing certificate for pid %d", pid);
+ "cupsdDeleteCert: Removing certificate for PID %d", pid);
DEBUG_printf(("DELETE pid=%d, username=%s, cert=%s\n", cert->pid,
cert->username, cert->certificate));
snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, pid);
if (unlink(filename))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "cupsdDeleteCert: Unable to remove %s!", filename);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove %s!", filename);
return;
}
snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, cert->pid);
if (unlink(filename))
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "cupsdDeleteAllCerts: Unable to remove %s!", filename);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove %s!", filename);
/*
* Free memory...
cupsd_cert_t *cert; /* Current certificate */
- DEBUG_printf(("cupsdFindCert(certificate=%s)\n", certificate));
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)",
+ certificate);
for (cert = Certs; cert != NULL; cert = cert->next)
if (!strcasecmp(certificate, cert->certificate))
{
- DEBUG_printf((" returning %s...\n", cert->username));
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning %s...",
+ cert->username);
return (cert);
}
- DEBUG_puts(" certificate not found!");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found!");
return (NULL);
}
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAcceptClient(lis=%p) %d Clients = %d",
+ "cupsdAcceptClient(lis=%p(%d)) Clients=%d",
lis, lis->fd, cupsArrayCount(Clients));
/*
* Can't have an unresolved IP address with double-lookups enabled...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAcceptClient: Closing connection %d...",
- con->http.fd);
-
#ifdef WIN32
closesocket(con->http.fd);
#else
* with double-lookups enabled...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAcceptClient: Closing connection %d...",
- con->http.fd);
-
#ifdef WIN32
closesocket(con->http.fd);
#else
if (!hosts_access(&wrap_req))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAcceptClient: Closing connection %d...",
- con->http.fd);
-
#ifdef WIN32
closesocket(con->http.fd);
#else
cupsArrayAdd(Clients, con);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAcceptClient: %d connected to server on %s:%d",
- con->http.fd, con->servername, con->serverport);
-
/*
- * Using TCP_NODELAY improves responsiveness, especially on systems
- * with a slow loopback interface... Since we write large buffers
- * when sending print files and requests, there shouldn't be any
- * performance penalty for this...
+ * Using TCP_NODELAY improves responsiveness, especially on systems with a slow
+ * loopback interface. Since we write large buffers when sending print files
+ * and requests there shouldn't be any performance penalty for this...
*/
val = 1;
fcntl(con->http.fd, F_SETFD, fcntl(con->http.fd, F_GETFD) | FD_CLOEXEC);
/*
- * Add the socket to the select() input mask.
+ * Add the socket to the server select.
*/
cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con);
cupsd_client_t *con; /* Current client */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d",
+ cupsArrayCount(Clients));
+
for (con = (cupsd_client_t *)cupsArrayFirst(Clients);
con;
con = (cupsd_client_t *)cupsArrayNext(Clients))
#endif /* HAVE_LIBSSL */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCloseClient: %d", con->http.fd);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseClient(con=%p(%d))", con,
+ con->http.fd);
/*
* Flush pending writes before closing...
* Stop any CGI process...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCloseClient: %d Killing process ID %d...",
- con->http.fd, con->pipe_pid);
cupsdEndProcess(con->pipe_pid, 1);
con->pipe_pid = 0;
}
{
cupsdRemoveSelect(con->file);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCloseClient: %d Closing data file %d.",
- con->http.fd, con->file);
-
close(con->file);
con->file = -1;
}
status = HTTP_CONTINUE;
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d, used=%d, file=%d state=%d",
- con->http.fd, con->http.used, con->file, con->http.state);
+ "cupsdReadClient(con=%p(%d)) "
+ "con->http.error=%d "
+ "con->http.used=%d, "
+ "con->http.state=%d "
+ "con->data_encoding=HTTP_ENCODE_%s, "
+ "con->data_remaining=" CUPS_LLFMT ", "
+ "con->file=%d",
+ con, con->http.fd, con->http.error, con->http.used,
+ con->http.state,
+ con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
+ "CHUNKED" : "LENGTH",
+ CUPS_LLCAST con->http.data_remaining, con->file);
if (con->http.error)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadClient: http error seen...");
cupsdCloseClient(con);
return;
}
*/
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: Saw first byte %02X, auto-negotiating SSL/TLS session...",
- buf[0] & 255);
+ "cupsdReadClient: Saw first byte %02X, auto-negotiating "
+ "SSL/TLS session...", buf[0] & 255);
if (!encrypt_client(con))
cupsdCloseClient(con);
if (httpGets(line, sizeof(line) - 1, HTTP(con)) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: httpGets returned EOF...");
cupsdCloseClient(con);
return;
}
snprintf(locale, sizeof(locale), "%s.%s",
con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], DefaultCharset);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d Browser asked for language \"%s\"...",
- con->http.fd, locale);
-
con->language = cupsLangGet(locale);
}
else
if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_OK)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: Unauthorized request for %s...",
- con->uri);
cupsdSendError(con, status, CUPSD_AUTH_NONE);
cupsdCloseClient(con);
return;
* so check the length against any limits that are set...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "POST %s", con->uri);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "CONTENT_TYPE = %s",
- con->http.fields[HTTP_FIELD_CONTENT_TYPE]);
-
if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
MaxRequestSize > 0 &&
con->http.data_remaining > MaxRequestSize)
cupsdSetString(&con->options, NULL);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d command=\"%s\", "
- "options = \"%s\"",
- con->http.fd, con->command,
- con->options ? con->options : "(null)");
-
if (con->http.version <= HTTP_1_0)
con->http.keep_alive = HTTP_KEEPALIVE_OFF;
}
* so check the length against any limits that are set...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "PUT %s", con->uri);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "CONTENT_TYPE = %s",
- con->http.fields[HTTP_FIELD_CONTENT_TYPE]);
-
if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] &&
MaxRequestSize > 0 &&
con->http.data_remaining > MaxRequestSize)
}
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d REQUEST %s=%d", con->http.fd,
- con->filename, con->file);
-
fchmod(con->file, 0640);
fchown(con->file, RunUser, Group);
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
switch (con->http.state)
{
case HTTP_PUT_RECV :
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d con->data_encoding=HTTP_ENCODE_%s, "
- "con->data_remaining=" CUPS_LLFMT ", con->file=%d",
- con->http.fd,
- con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
- "CHUNKED" : "LENGTH",
- CUPS_LLCAST con->http.data_remaining, con->file);
-
do
{
if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0)
{
con->bytes += bytes;
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d writing %d bytes to %d",
- con->http.fd, bytes, con->file);
-
if (write(con->file, line, bytes) < bytes)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdReadClient: Unable to write %d bytes to %s: %s",
bytes, con->filename, strerror(errno));
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: Closing data file %d...",
- con->file);
-
close(con->file);
con->file = -1;
unlink(con->filename);
fstat(con->file, &filestats);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d Closing data file %d, size="
- CUPS_LLFMT ".",
- con->http.fd, con->file,
- CUPS_LLCAST filestats.st_size);
-
close(con->file);
con->file = -1;
* Request is too big; remove it and send an error...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d Removing temp file %s",
- con->http.fd, con->filename);
unlink(con->filename);
cupsdClearString(&con->filename);
break;
case HTTP_POST_RECV :
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d con->data_encoding=HTTP_ENCODE_"
- "%s, con->data_remaining=" CUPS_LLFMT ", con->file=%d",
- con->http.fd,
- con->http.data_encoding == HTTP_ENCODE_CHUNKED ?
- "CHUNKED" : "LENGTH",
- CUPS_LLCAST con->http.data_remaining, con->file);
-
do
{
if (con->request)
}
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadClient: %d REQUEST %s=%d", con->http.fd,
- con->filename, con->file);
-
fchmod(con->file, 0640);
fchown(con->file, RunUser, Group);
fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC);
{
con->bytes += bytes;
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d writing %d bytes to %d",
- con->http.fd, bytes, con->file);
-
if (write(con->file, line, bytes) < bytes)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdReadClient: Unable to write %d bytes to %s: %s",
bytes, con->filename, strerror(errno));
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: Closing file %d...",
- con->file);
-
close(con->file);
con->file = -1;
unlink(con->filename);
{
fstat(con->file, &filestats);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d Closing data file %d, "
- "size=" CUPS_LLFMT ".",
- con->http.fd, con->file,
- CUPS_LLCAST filestats.st_size);
-
close(con->file);
con->file = -1;
* Request is too big; remove it and send an error...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d Removing temp file %s",
- con->http.fd, con->filename);
unlink(con->filename);
cupsdClearString(&con->filename);
if (con->filename)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdReadClient: %d Removing temp file %s",
- con->http.fd, con->filename);
unlink(con->filename);
cupsdClearString(&con->filename);
}
http_status_t code, /* I - Error code */
int auth_type)/* I - Authentication type */
{
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdSendError(con=%p(%d), code=%d, auth_type=%d", con,
+ con->http.fd, code, auth_type);
+
#ifdef HAVE_SSL
/*
* Force client to upgrade for authentication if that is how the
strcasecmp(con->http.hostname, "localhost") &&
!con->http.tls)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdSendError: Encryption before authentication!");
code = HTTP_UPGRADE_REQUIRED;
}
#endif /* HAVE_SSL */
cupsdLogRequest(con, code);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSendError: %d code=%d (%s)",
- con->http.fd, code, httpStatus(code));
-
/*
* To work around bugs in some proxies, don't use Keep-Alive for some
* error messages...
ipp_state_t ipp_state; /* IPP state value */
-#ifdef DEBUG
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdWriteClient(con=%p) %d response=%p(%d), file=%d "
+ "cupsdWriteClient(con=%p(%d)) response=%p(%d), file=%d "
"pipe_pid=%d state=%d",
con, con->http.fd, con->response,
con->response ? con->response->state : -1,
con->file, con->pipe_pid, con->http.state);
-#endif /* DEBUG */
if (con->http.state != HTTP_GET_SEND &&
con->http.state != HTTP_POST_SEND)
}
else if ((bytes = read(con->file, buf, sizeof(buf) - 1)) > 0)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdWriteClient: Read %d bytes from file %d...",
- bytes, con->file);
-
if (con->pipe_pid && !con->got_fields)
{
/*
if (strncasecmp(buf, "Status:", 7))
httpPrintf(HTTP(con), "%s\r\n", buf);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdWriteClient: %d %s",
- con->http.fd, buf);
-
/*
* Update buffer...
*/
con->field_col ++;
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdWriteClient: %d bytes=%d, got_fields=%d",
- con->http.fd, bytes, con->got_fields);
-
if (bytes > 0 && !con->got_fields)
{
/*
{
if (httpWrite2(HTTP(con), buf, bytes) < 0)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdWriteClient: %d Write of %d bytes failed!",
- con->http.fd, bytes);
-
cupsdCloseClient(con);
return;
}
if (bytes <= 0)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdWriteClient: %d bytes < 0",
- con->http.fd);
-
cupsdLogRequest(con, HTTP_OK);
httpFlushWrite(HTTP(con));
if (con->pipe_pid)
cupsdEndProcess(con->pipe_pid, 0);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdWriteClient: %d Closing data file %d.",
- con->http.fd, con->file);
-
close(con->file);
con->file = -1;
con->pipe_pid = 0;
if (con->filename)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdWriteClient: %d Removing temp file %s",
- con->http.fd, con->filename);
unlink(con->filename);
cupsdClearString(&con->filename);
}
return (1);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "check_if_modified: %d If-Modified-Since=\"%s\"",
- con->http.fd, ptr);
+ "check_if_modified(con=%p(%d), "
+ "filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"",
+ con, con->http.fd, filestats, CUPS_LLCAST filestats->st_size,
+ (int)filestats->st_mtime, ptr);
while (*ptr != '\0')
{
ptr ++;
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "check_if_modified: %d sizes=" CUPS_LLFMT ","
- CUPS_LLFMT " dates=%d,%d",
- con->http.fd, CUPS_LLCAST size,
- CUPS_LLCAST filestats->st_size, (int)date,
- (int)filestats->st_mtime);
-
return ((size != filestats->st_size && size != 0) ||
(date < filestats->st_mtime && date != 0) ||
(size == 0 && date == 0));
unsigned long error; /* Error code */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con,
+ con->http.fd);
+
/*
* Verify that we have a certificate...
*/
if (SSL_accept(conn) != 1)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "encrypt_client: Unable to encrypt connection from %s!",
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to encrypt connection from %s!",
con->http.hostname);
while ((error = ERR_get_error()) != 0)
- cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s",
- ERR_error_string(error, NULL));
+ cupsdLogMessage(CUPSD_LOG_ERROR, "%s", ERR_error_string(error, NULL));
SSL_CTX_free(context);
SSL_free(conn);
return (0);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "encrypt_client: %d Connection from %s now encrypted.",
- con->http.fd, con->http.hostname);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
+ con->http.hostname);
con->http.tls = conn;
return (1);
/* TLS credentials */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con,
+ con->http.fd);
+
/*
* Verify that we have a certificate...
*/
if (credentials == NULL)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "encrypt_client: Unable to encrypt connection from %s!",
- con->http.hostname);
- cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s", strerror(errno));
+ "Unable to encrypt connection from %s - %s",
+ con->http.hostname, strerror(errno));
free(conn);
return (0);
if (error != GNUTLS_E_SUCCESS)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "encrypt_client: Unable to encrypt connection from %s!",
- con->http.hostname);
- cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s",
- gnutls_strerror(error));
+ "Unable to encrypt connection from %s - %s",
+ con->http.hostname, gnutls_strerror(error));
gnutls_deinit(conn->session);
gnutls_certificate_free_credentials(*credentials);
return (0);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "encrypt_client: %d Connection from %s now encrypted.",
- con->http.fd, con->http.hostname);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
+ con->http.hostname);
conn->credentials = credentials;
con->http.tls = conn;
http_tls_t *conn; /* CDSA connection information */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con,
+ con->http.fd);
+
if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL)
return (0);
if (!conn->certsArray)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "encrypt_client: Could not find signing key in keychain "
- "\"%s\"", ServerCertificate);
+ "Could not find signing key in keychain \"%s\"",
+ ServerCertificate);
error = errSSLBadCert; /* errSSLBadConfiguration is a better choice, but not available on 10.2.x */
}
if (error)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "encrypt_client: Unable to encrypt connection from %s!",
- con->http.hostname);
-
- cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s (%d)",
- cssmErrorString(error), (int)error);
+ "Unable to encrypt connection from %s - %s (%d)",
+ con->http.hostname, cssmErrorString(error), (int)error);
con->http.error = error;
con->http.status = HTTP_ERROR;
return (0);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "encrypt_client: %d Connection from %s now encrypted.",
- con->http.fd, con->http.hostname);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.",
+ con->http.hostname);
con->http.tls = conn;
return (1);
if ((err = SecKeychainOpen(ServerCertificate, &keychain)))
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\", %s",
- ServerCertificate, cssmErrorString(err));
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\" - %s (%d)",
+ ServerCertificate, cssmErrorString(err), (int)err);
return (NULL);
}
if (SecPolicySearchCopyNext(policy_search, &policy))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
+ cupsdLogMessage(CUPSD_LOG_ERROR,
"Cannot find a policy to use for searching");
CFRelease(keychain);
CFRelease(policy_search);
if (SecPolicySetValue(policy, &options))
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
+ cupsdLogMessage(CUPSD_LOG_ERROR,
"Cannot set policy value to use for searching");
CFRelease(keychain);
CFRelease(policy_search);
if (err)
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Cannot create keychain search reference: %s",
- cssmErrorString(err));
+ "Cannot create keychain search reference: %s (%d)",
+ cssmErrorString(err), (int)err);
else
{
if ((err = SecIdentitySearchCopyNext(search, &identity)))
{
cupsdLogMessage(CUPSD_LOG_DEBUG,
- "Cannot find signing key in keychain \"%s\", error %d",
- ServerCertificate, (int)err);
+ "Cannot find signing key in keychain \"%s\": %s (%d)",
+ ServerCertificate, cssmErrorString(err), (int)err);
}
else
{
while (status && language[0]);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_file: %d filename=%s size=%d",
- con->http.fd, filename,
- status ? -1 : (int)filestats->st_size);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "get_file(con=%p(%d), filestats=%p, filename=%p, len=%d) = "
+ "%s", con, con->http.fd, filestats, filename, len,
+ status ? "(null)" : filename);
if (!status)
con->http.data_remaining = (int)filestats->st_size;
const char *options; /* Options on URL */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "is_cgi(con=%p, filename=\"%s\", filestats=%p, type=%s/%s)",
- con, filename, filestats, type ? type->super : "unknown",
- type ? type->type : "unknown");
-
/*
* Get the options, if any...
*/
if (!type || strcasecmp(type->super, "application"))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "is_cgi: Returning 0...");
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 0", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (0);
}
cupsdSetStringf(&con->options, " %s", options);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"",
- con->command, con->options);
-
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 1", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (1);
}
#ifdef HAVE_JAVA
cupsdSetStringf(&con->options, " %s", filename);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"",
- con->command, con->options);
-
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 1", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (1);
}
#endif /* HAVE_JAVA */
cupsdSetStringf(&con->options, " %s", filename);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"",
- con->command, con->options);
-
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 1", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (1);
}
#endif /* HAVE_PERL */
cupsdSetStringf(&con->options, " %s", filename);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"",
- con->command, con->options);
-
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 1", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (1);
}
#endif /* HAVE_PHP */
cupsdSetStringf(&con->options, " %s", filename);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"",
- con->command, con->options);
-
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 1", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (1);
}
#endif /* HAVE_PYTHON */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "is_cgi: Returning 0...");
-
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, "
+ "type=%s/%s) = 0", con, con->http.fd, filename, filestats,
+ type ? type->super : "unknown",
+ type ? type->type : "unknown");
return (0);
}
envp[envc++] = home;
envp[envc] = NULL;
- if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL,
+ if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL, 0,
&pid))
{
unlink(seedfile);
break;
}
- cupsdFinishProcess(pid, command, sizeof(command));
+ cupsdFinishProcess(pid, command, sizeof(command), NULL);
/*
* Remove the seed file, as it is no longer needed...
infofd = open(infofile, O_RDONLY);
if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
- &pid))
+ 0, &pid))
{
close(infofd);
unlink(infofile);
break;
}
- cupsdFinishProcess(pid, command, sizeof(command));
+ cupsdFinishProcess(pid, command, sizeof(command), NULL);
if (status)
{
infofd = open(infofile, O_RDONLY);
if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL,
- &pid))
+ 0, &pid))
{
close(infofd);
unlink(infofile);
break;
}
- cupsdFinishProcess(pid, command, sizeof(command));
+ cupsdFinishProcess(pid, command, sizeof(command), NULL);
if (status)
{
*/
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "pipe_command: command=\"%s\", options=\"%s\"",
- command, options ? options : "(null)");
+ "pipe_command(con=%p(%d), infile=%d, outfile=%p, "
+ "command=\"%s\", options=\"%s\", root=%d)",
+ con, con->http.fd, infile, outfile, command,
+ options ? options : "(null)", root);
argv[0] = command;
{
KerberosContext = NULL;
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to initialize Kerberos context");
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to initialize Kerberos context");
}
}
principal)))
{
cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to initialize credentials cache (%d/%s)", error,
- strerror(errno));
+ "Unable to initialize credentials cache (%d/%s)",
+ error, strerror(errno));
krb5_cc_destroy(KerberosContext, ccache);
krb5_free_principal(KerberosContext, principal);
ccache = NULL;
*/
if (cupsdStartProcess(command, argv, envp, infile, fds[1], CGIPipes[1],
- -1, -1, root, DefaultProfile, &pid) < 0)
+ -1, -1, root, DefaultProfile, 0, &pid) < 0)
{
/*
* Error - can't fork!
{
con->file = open(filename, O_RDONLY);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "write_file: %d file=%d", con->http.fd,
- con->file);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "write_file(con=%p(%d), code=%d, filename=\"%s\" (%d), "
+ "type=\"%s\", filestats=%p)", con, con->http.fd,
+ code, filename, con->file, type ? type : "(null)", filestats);
if (con->file < 0)
return (0);
static void
write_pipe(cupsd_client_t *con) /* I - Client connection */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "write_pipe: CGI output on fd %d...",
- con->file);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "write_pipe(con=%p(%d)) CGI output on fd %d",
+ con, con->http.fd, con->file);
con->file_ready = 1;
*
* Device scanning mini-daemon for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
{
for (i = 0; i < num_backends; i ++)
if (backend_fds[i].revents && backends[i].pipe)
- if (get_device(backends + i))
+ {
+ cups_file_t *bpipe = backends[i].pipe;
+ /* Copy of pipe for backend... */
+
+ do
{
- backend_fds[i].fd = 0;
- backend_fds[i].events = 0;
+ if (get_device(backends + i))
+ {
+ backend_fds[i].fd = 0;
+ backend_fds[i].events = 0;
+ break;
+ }
}
+ while (bpipe->ptr &&
+ memchr(bpipe->ptr, '\n', bpipe->end - bpipe->ptr));
+ }
}
/*
*
* Main header file for the Common UNIX Printing System (CUPS) scheduler.
*
- * Copyright 2007-2008 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
extern void *cupsdCreateProfile(int job_id);
extern void cupsdDestroyProfile(void *profile);
extern int cupsdEndProcess(int pid, int force);
-extern const char *cupsdFinishProcess(int pid, char *name, int namelen);
+extern const char *cupsdFinishProcess(int pid, char *name, int namelen,
+ int *job_id);
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 *pid);
+ int root, void *profile, int job_id,
+ int *pid);
extern int cupsdAddSelect(int fd, cupsd_selfunc_t read_cb,
cupsd_selfunc_t write_cb, void *data);
argv[1] = pollp->hostname;
if (cupsdStartProcess(polld, argv, envp, -1, -1, statusfds[1], -1, -1,
- 0, DefaultProfile, &(pollp->pid)) < 0)
+ 0, DefaultProfile, 0, &(pollp->pid)) < 0)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"cupsdStartPolling: Unable to fork polling daemon - %s",
argv[4] = NULL;
cupsdStartProcess("/bin/launchctl", argv, envp, -1, -1, -1, -1, -1, 1,
- NULL, &pid);
+ NULL, 0, &pid);
}
#endif /* __APPLE__ */
else
if (need_restart_job && pclass->job)
{
- cupsd_job_t *job;
-
/*
- * Stop the current job and then restart it below...
+ * Reset the current job to a "pending" status...
*/
- job = (cupsd_job_t *)pclass->job;
-
- cupsdStopJob(job, 1);
-
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
+ cupsdSetJobState(pclass->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE,
+ "Job restarted because the class was modified.");
}
- if (need_restart_job)
- cupsdCheckJobs();
-
cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP);
if (modify)
if (!compressions || !filetypes)
{
- cupsdCancelJob(job, 1, IPP_JOB_ABORTED);
+ cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE,
+ "Job aborted because the scheduler ran out of memory.");
if (con)
send_ipp_status(con, IPP_INTERNAL_ERROR,
* Hold job until specified time...
*/
- cupsdSetJobHoldUntil(job, attr->values[0].string.text);
+ cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0);
job->state->values[0].integer = IPP_JOB_HELD;
job->state_value = IPP_JOB_HELD;
if ((kbytes = copy_banner(con, job, attr->values[0].string.text)) < 0)
{
- cupsdDeleteJob(job);
+ cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE,
+ "Aborting job because the start banner could not be "
+ "copied.");
return (NULL);
}
if (need_restart_job && printer->job)
{
- cupsd_job_t *job;
-
/*
- * Stop the current job and then restart it below...
+ * Restart the current job...
*/
- job = (cupsd_job_t *)printer->job;
-
- cupsdStopJob(job, 1);
-
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
+ cupsdSetJobState(printer->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE,
+ "Job restarted because the printer was modified.");
}
- if (need_restart_job)
- cupsdCheckJobs();
-
cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP);
if (modify)
}
/*
- * See if the printer is currently printing a job...
+ * See if there are any pending jobs...
*/
- if (printer->job)
- jobid = ((cupsd_job_t *)printer->job)->id;
+ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
+ if (job->state_value <= IPP_JOB_PROCESSING &&
+ !strcasecmp(job->dest, printer->name))
+ break;
+
+ if (job)
+ jobid = job->id;
else
{
/*
- * No, see if there are any pending jobs...
+ * No, try stopped jobs...
*/
- for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
+ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
job;
job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
- if (job->state_value <= IPP_JOB_PROCESSING &&
+ if (job->state_value == IPP_JOB_STOPPED &&
!strcasecmp(job->dest, printer->name))
break;
jobid = job->id;
else
{
- for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
- job;
- job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
- if (job->state_value == IPP_JOB_STOPPED &&
- !strcasecmp(job->dest, printer->name))
- break;
-
- if (job)
- jobid = job->id;
- else
- {
- send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s!"),
- printer->name);
- return;
- }
+ send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s!"),
+ printer->name);
+ return;
}
}
}
* Cancel the job and return...
*/
- cupsdCancelJob(job, purge, IPP_JOB_CANCELED);
+ cupsdSetJobState(job, IPP_JOB_CANCELED, purge,
+ purge ? "Job purged by \"%s\"" : "Job canceled by \"%s\"",
+ username);
cupsdCheckJobs();
if (purge)
"copy_model: Running \"cups-driverd cat %s\"...", from);
if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1],
- -1, -1, 0, DefaultProfile, &temppid))
+ -1, -1, 0, DefaultProfile, 0, &temppid))
{
close(tempfd);
unlink(tempfile);
sizeof(scheme), username, sizeof(username), host,
sizeof(host), &port, resource, sizeof(resource));
- if (!strcmp(resource, "/"))
+ if (!strcmp(resource, "/") || !strcmp(resource, "/jobs"))
{
dest = NULL;
dtype = (cups_ptype_t)0;
hold_job(cupsd_client_t *con, /* I - Client connection */
ipp_attribute_t *uri) /* I - Job or Printer URI */
{
- ipp_attribute_t *attr, /* Current job-hold-until */
- *newattr; /* New job-hold-until */
+ ipp_attribute_t *attr; /* Current job-hold-until */
+ const char *when; /* New value */
int jobid; /* Job ID */
char scheme[HTTP_MAX_URI], /* Method portion of URI */
username[HTTP_MAX_URI], /* Username portion of URI */
* Hold the job and return...
*/
- cupsdHoldJob(job);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job,
- "Job held by user.");
-
- if ((newattr = ippFindAttribute(con->request, "job-hold-until",
- IPP_TAG_KEYWORD)) == NULL)
- newattr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME);
-
- if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
- IPP_TAG_KEYWORD)) == NULL)
- attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
+ if ((attr = ippFindAttribute(con->request, "job-hold-until",
+ IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME);
if (attr)
{
- /*
- * Free the old hold value and copy the new one over...
- */
-
- _cupsStrFree(attr->values[0].string.text);
-
- if (newattr)
- {
- attr->value_tag = newattr->value_tag;
- attr->values[0].string.text =
- _cupsStrRetain(newattr->values[0].string.text);
- }
- else
- {
- attr->value_tag = IPP_TAG_KEYWORD;
- attr->values[0].string.text = _cupsStrAlloc("indefinite");
- }
-
- /*
- * Hold job until specified time...
- */
-
- cupsdSetJobHoldUntil(job, attr->values[0].string.text);
+ when = attr->values[0].string.text;
cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job,
- "Job job-hold-until value changed by user.");
+ "Job job-hold-until value changed by user.");
}
+ else
+ when = "indefinite";
- cupsdLogJob(job, CUPSD_LOG_INFO, "Held by \"%s\".", username);
+ cupsdSetJobHoldUntil(job, when, 1);
+ cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".",
+ username);
con->response->request.status.status_code = IPP_OK;
}
{
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d",
attr->values[0].integer);
-
- job->state->values[0].integer = attr->values[0].integer;
- job->state_value = (ipp_jstate_t)attr->values[0].integer;
-
- event |= CUPSD_EVENT_JOB_STATE;
+ cupsdSetJobState(job, attr->values[0].integer,
+ CUPSD_JOB_DEFAULT,
+ "Job state changed by \"%s\"", username);
check_jobs = 1;
}
break;
{
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d",
attr->values[0].integer);
- cupsdCancelJob(job, 0, (ipp_jstate_t)attr->values[0].integer);
-
+ cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer,
+ CUPSD_JOB_DEFAULT,
+ "Job state changed by \"%s\"", username);
check_jobs = 1;
}
break;
{
cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-hold-until to %s",
attr->values[0].string.text);
- cupsdSetJobHoldUntil(job, attr->values[0].string.text);
+ cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0);
if (!strcmp(attr->values[0].string.text, "no-hold"))
+ {
cupsdReleaseJob(job);
+ check_jobs = 1;
+ }
else
- cupsdHoldJob(job);
+ cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT,
+ "Job held by \"%s\".", username);
- check_jobs = 1;
- event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE;
+ event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE;
}
}
else if (attr->value_tag == IPP_TAG_DELETEATTR)
*
* Contents:
*
- * cupsdAddJob() - Add a new job to the job queue...
- * cupsdCancelJob() - Cancel the specified print job.
+ * cupsdAddJob() - Add a new job to the job queue.
* cupsdCancelJobs() - Cancel all jobs for the given
- * destination/user...
+ * destination/user.
* cupsdCheckJobs() - Check the pending jobs and start any if the
* destination is available.
* cupsdCleanJobs() - Clean out old jobs.
+ * cupsdContinueJob() - Continue printing with the next file in a job.
* cupsdDeleteJob() - Free all memory used by a job.
* cupsdFinishJob() - Finish a job.
* cupsdFreeAllJobs() - Free all jobs from memory.
* jobs in a printer or class.
* cupsdGetUserJobCount() - Get the number of pending, processing, or held
* jobs for a user.
- * cupsdHoldJob() - Hold the specified job.
* cupsdLoadAllJobs() - Load all jobs from disk.
- * cupsdLoadJob() - Load a single job...
+ * cupsdLoadJob() - Load a single job.
* cupsdMoveJob() - Move the specified job to a different
* destination.
* cupsdReleaseJob() - Release the specified job.
* cupsdRestartJob() - Restart the specified job.
* cupsdSaveAllJobs() - Save a summary of all jobs to disk.
* cupsdSaveJob() - Save a job to disk.
- * cupsdSetJobHoldUntil() - Set the hold time for a job...
+ * cupsdSetJobHoldUntil() - Set the hold time for a job.
* cupsdSetJobPriority() - Set the priority of a job, moving it up/down
* in the list as needed.
+ * cupsdSetJobState() - Set the state of the specified print job.
* cupsdStopAllJobs() - Stop all print jobs.
- * cupsdStopJob() - Stop a print job.
* cupsdUnloadCompletedJobs() - Flush completed job history from memory.
* compare_active_jobs() - Compare the job IDs and priorities of two
* jobs.
* compare_jobs() - Compare the job IDs of two jobs.
+ * finalize_job() - Cleanup after job filter processes and support
+ * data.
+ * get_options() - Get a string containing the job options.
* ipp_length() - Compute the size of the buffer needed to hold
* the textual IPP attributes.
* load_job_cache() - Load jobs from the job.cache file.
* load_next_job_id() - Load the NextJobId value from the job.cache
* file.
* load_request_root() - Load jobs from the RequestRoot directory.
- * set_time() - Set one of the "time-at-xyz" attributes...
* set_hold_until() - Set the hold time and update job-hold-until
- * attribute...
+ * attribute.
+ * set_time() - Set one of the "time-at-xyz" attributes.
* start_job() - Start a print job.
+ * stop_job() - Stop a print job.
* unload_job() - Unload a job from memory.
* update_job() - Read a status update from a job's filters.
* update_job_attrs() - Update the job-printer-* attributes.
#include <cups/dir.h>
+/*
+ * Design Notes for Job Management
+ * -------------------------------
+ *
+ * STATE CHANGES
+ *
+ * pending Do nothing/check jobs
+ * pending-held Send SIGTERM to filters and backend
+ * processing Do nothing/start job
+ * stopped Send SIGKILL to filters and backend
+ * canceled Send SIGTERM to filters and backend
+ * aborted Finalize
+ * completed Finalize
+ *
+ * Finalize clears the printer <-> job association, deletes the status
+ * buffer, closes all of the pipes, etc. and doesn't get run until all of
+ * the print processes are finished.
+ *
+ * UNLOADING OF JOBS (cupsdUnloadCompletedJobs)
+ *
+ * We unload the job attributes when they are not needed to reduce overall
+ * memory consumption. We don't unload jobs where job->state_value <
+ * IPP_JOB_STOPPED, job->printer != NULL, or job->access_time is recent.
+ *
+ * STARTING OF JOBS (start_job)
+ *
+ * When a job is started, a status buffer, several pipes, a security
+ * profile, and a backend process are created for the life of that job.
+ * These are shared for every file in a job. For remote print jobs, the
+ * IPP backend is provided with every file in the job and no filters are
+ * run.
+ *
+ * The job->printer member tracks which printer is printing a job, which
+ * can be different than the destination in job->dest for classes. The
+ * printer object also has a job pointer to track which job is being
+ * printed.
+ *
+ * PRINTING OF JOB FILES (cupsdContinueJob)
+ *
+ * Each file in a job is filtered by 0 or more programs. After getting the
+ * list of filters needed and the total cost, the job is either passed or
+ * put back to the processing state until the current FilterLevel comes down
+ * enough to allow printing.
+ *
+ * If we can print, we build a string for the print options and run each of
+ * the filters, piping the output from one into the next.
+ *
+ * JOB STATUS UPDATES (update_job)
+ *
+ * The update_job function gets called whenever there are pending messages
+ * on the status pipe. These generally are updates to the marker-*,
+ * printer-state-message, or printer-state-reasons attributes. On EOF,
+ * finalize_job is called to clean up.
+ *
+ * FINALIZING JOBS (finalize_job)
+ *
+ * When all filters and the backend are done, we set the job state to
+ * completed (no errors), aborted (filter errors or abort-job policy),
+ * pending-held (auth required or retry-job policy), or pending
+ * (retry-current-job or stop-printer policies) as appropriate.
+ *
+ * Then we close the pipes and free the status buffers and profiles.
+ *
+ * JOB FILE COMPLETION (process_children in main.c)
+ *
+ * For multiple-file jobs, process_children (in main.c) sees that all
+ * filters have exited and calls in to print the next file if there are
+ * more files in the job, otherwise it waits for the backend to exit and
+ * update_job to do the cleanup.
+ */
+
+
/*
* Local globals...
*/
static int compare_active_jobs(void *first, void *second, void *data);
static int compare_jobs(void *first, void *second, void *data);
+static void finalize_job(cupsd_job_t *job);
+static char *get_options(cupsd_job_t *job, int banner_page, char *copies,
+ size_t copies_size, char *title,
+ size_t title_size);
static int ipp_length(ipp_t *ipp);
static void load_job_cache(const char *filename);
static void load_next_job_id(const char *filename);
static void load_request_root(void);
-static void set_time(cupsd_job_t *job, const char *name);
static void set_hold_until(cupsd_job_t *job, time_t holdtime);
+static void set_time(cupsd_job_t *job, const char *name);
static void start_job(cupsd_job_t *job, cupsd_printer_t *printer);
+static void stop_job(cupsd_job_t *job, cupsd_jobaction_t action);
static void unload_job(cupsd_job_t *job);
static void update_job(cupsd_job_t *job);
static void update_job_attrs(cupsd_job_t *job, int do_message);
/*
- * 'cupsdAddJob()' - Add a new job to the job queue...
+ * 'cupsdAddJob()' - Add a new job to the job queue.
*/
cupsd_job_t * /* O - New job record */
/*
- * 'cupsdCancelJob()' - Cancel the specified print job.
- */
-
-void
-cupsdCancelJob(cupsd_job_t *job, /* I - Job to cancel */
- int purge, /* I - Purge jobs? */
- ipp_jstate_t newstate) /* I - New job state */
-{
- int i; /* Looping var */
- char filename[1024]; /* Job filename */
- cupsd_printer_t *printer; /* Printer used by job */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCancelJob: id = %d", job->id);
-
- /*
- * Stop any processes that are working on the current job...
- */
-
- if ((printer = job->printer) == NULL)
- printer = cupsdFindDest(job->dest);
-
- if (job->state_value == IPP_JOB_PROCESSING)
- cupsdStopJob(job, 0);
-
- cupsdLoadJob(job);
-
- if (job->attrs)
- job->state->values[0].integer = newstate;
-
- job->state_value = newstate;
-
- set_time(job, "time-at-completed");
-
- /*
- * Send any pending notifications and then expire them...
- */
-
- switch (newstate)
- {
- default :
- break;
-
- case IPP_JOB_CANCELED :
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, printer, job,
- purge ? "Job purged." : "Job canceled.");
- break;
-
- case IPP_JOB_ABORTED :
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, printer, job,
- "Job aborted; please consult the error_log file "
- "for details.");
- break;
-
- case IPP_JOB_COMPLETED :
- /*
- * Clear the printer's printer-state-message and move on...
- */
-
- printer->state_message[0] = '\0';
-
- cupsdSetPrinterState(printer, IPP_PRINTER_IDLE, 0);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, printer, job,
- "Job completed.");
- break;
- }
-
- cupsdExpireSubscriptions(NULL, job);
-
- /*
- * Remove the job from the active and printing lists...
- */
-
- cupsArrayRemove(ActiveJobs, job);
- cupsArrayRemove(PrintingJobs, job);
-
-#ifdef __APPLE__
- /*
- * If we are going to sleep and the PrintingJobs count is now 0, allow the
- * sleep to happen immediately...
- */
-
- if (Sleeping && cupsArrayCount(PrintingJobs) == 0)
- cupsdAllowSleep();
-#endif /* __APPLE__ */
-
- /*
- * Remove any authentication data...
- */
-
- snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id);
- if (cupsdRemoveFile(filename) && errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to remove authentication cache: %s",
- strerror(errno));
-
- cupsdClearString(&job->auth_username);
- cupsdClearString(&job->auth_domain);
- cupsdClearString(&job->auth_password);
-
-#ifdef HAVE_GSSAPI
- /*
- * Destroy the credential cache and clear the KRB5CCNAME env var string.
- */
-
- if (job->ccache)
- {
- krb5_cc_destroy(KerberosContext, job->ccache);
- job->ccache = NULL;
- }
-
- cupsdClearString(&job->ccname);
-#endif /* HAVE_GSSAPI */
-
- /*
- * Remove the print file for good if we aren't preserving jobs or
- * files...
- */
-
- job->current_file = 0;
-
- if (!JobHistory || !JobFiles || purge)
- {
- for (i = 1; i <= job->num_files; i ++)
- {
- snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
- job->id, i);
- unlink(filename);
- }
-
- if (job->num_files > 0)
- {
- free(job->filetypes);
- free(job->compressions);
-
- job->num_files = 0;
- job->filetypes = NULL;
- job->compressions = NULL;
- }
- }
-
- if (JobHistory && !purge)
- {
- /*
- * Save job state info...
- */
-
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
- }
- else
- {
- /*
- * Remove the job info file...
- */
-
- snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot,
- job->id);
- unlink(filename);
-
- /*
- * Remove the job from the "all jobs" list...
- */
-
- cupsArrayRemove(Jobs, job);
-
- /*
- * Free all memory used...
- */
-
- cupsdDeleteJob(job);
- }
-
- cupsdSetBusyState();
-}
-
-
-/*
- * 'cupsdCancelJobs()' - Cancel all jobs for the given destination/user...
+ * 'cupsdCancelJobs()' - Cancel all jobs for the given destination/user.
*/
void
job;
job = (cupsd_job_t *)cupsArrayNext(Jobs))
{
- if (!job->dest || !job->username)
- cupsdLoadJob(job);
-
- if (!job->dest || !job->username)
+ if ((!job->dest || !job->username) && !cupsdLoadJob(job))
continue;
- if ((dest == NULL || !strcmp(job->dest, dest)) &&
- (username == NULL || !strcmp(job->username, username)))
+ if ((!dest || !strcmp(job->dest, dest)) &&
+ (!username || !strcmp(job->username, username)))
{
/*
* Cancel all jobs matching this destination/user...
*/
- cupsdCancelJob(job, purge, IPP_JOB_CANCELED);
+ if (purge)
+ cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_PURGE,
+ "Job purged by user.");
+ else
+ cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT,
+ "Job canceled by user.");
}
}
ipp_attribute_t *attr; /* Job attribute */
- DEBUG_puts("cupsdCheckJobs()");
-
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdCheckJobs: %d active jobs, sleeping=%d, reload=%d",
cupsArrayCount(ActiveJobs), Sleeping, NeedReload);
* Start held jobs if they are ready...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdCheckJobs: Job %d: dest=%s, dtype=%x, "
- "state_value=%d, loaded=%s", job->id, job->dest, job->dtype,
- job->state_value, job->attrs ? "yes" : "no");
-
if (job->state_value == IPP_JOB_HELD &&
job->hold_until &&
job->hold_until < time(NULL))
continue;
}
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
-
- if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
- IPP_TAG_KEYWORD)) == NULL)
- attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
-
- if (attr)
- {
- attr->value_tag = IPP_TAG_KEYWORD;
- cupsdSetString(&(attr->values[0].string.text), "no-hold");
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
- }
+ cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT,
+ "Job submission timed out.");
}
/*
* Start pending jobs if the destination is available...
*/
- if (job->state_value == IPP_JOB_PENDING && !NeedReload && !Sleeping)
+ if (job->state_value == IPP_JOB_PENDING && !NeedReload && !Sleeping &&
+ !job->printer)
{
printer = cupsdFindDest(job->dest);
pclass = NULL;
* cancel the job...
*/
- cupsdLogMessage(CUPSD_LOG_WARN,
- "[Job %d] Printer/class %s has gone away; canceling "
- "job!", job->id, job->dest);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the destination printer/class has "
- "gone away.");
-
- cupsdCancelJob(job, 1, IPP_JOB_ABORTED);
+ cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE,
+ "Job aborted because the destination printer/class "
+ "has gone away.");
}
else if (printer && !printer->holding_new_jobs)
{
((printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is remote */
!printer->job)) /* and not printing */
{
- /*
- * Clear any message for the queue...
- */
-
- printer->state_message[0] = '\0';
-
/*
* Start the job...
*/
for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
job && cupsArrayCount(Jobs) >= MaxJobs;
job = (cupsd_job_t *)cupsArrayNext(Jobs))
- if (job->state_value >= IPP_JOB_CANCELED)
- cupsdCancelJob(job, 1, IPP_JOB_CANCELED);
+ if (job->state_value >= IPP_JOB_CANCELED && !job->printer)
+ cupsdDeleteJob(job, CUPSD_JOB_PURGE);
}
/*
- * 'cupsdDeleteJob()' - Free all memory used by a job.
+ * 'cupsdContinueJob()' - Continue printing with the next file in a job.
*/
void
-cupsdDeleteJob(cupsd_job_t *job) /* I - Job */
+cupsdContinueJob(cupsd_job_t *job) /* I - Job */
{
- cupsdClearString(&job->username);
- cupsdClearString(&job->dest);
- cupsdClearString(&job->auth_username);
- cupsdClearString(&job->auth_domain);
- cupsdClearString(&job->auth_password);
+ int i; /* Looping var */
+ int slot; /* Pipe slot */
+ cups_array_t *filters, /* Filters for job */
+ *prefilters; /* Filters with prefilters */
+ mime_filter_t *filter, /* Current filter */
+ *prefilter, /* Prefilter */
+ port_monitor; /* Port monitor filter */
+ char scheme[255]; /* Device URI scheme */
+ ipp_attribute_t *attr; /* Current attribute */
+ const char *ptr, /* Pointer into value */
+ *abort_message; /* Abort message */
+ struct stat backinfo; /* Backend file information */
+ int backroot; /* Run backend as root? */
+ int pid; /* Process ID of new filter process */
+ int banner_page; /* 1 if banner page, 0 otherwise */
+ int filterfds[2][2];/* Pipes used between filters */
+ int envc; /* Number of environment variables */
+ char **argv, /* Filter command-line arguments */
+ filename[1024], /* Job filename */
+ command[1024], /* Full path to command */
+ jobid[255], /* Job ID string */
+ title[IPP_MAX_NAME],
+ /* Job title string */
+ copies[255], /* # copies string */
+ *options, /* Options string */
+ *envp[MAX_ENV + 19],
+ /* Environment variables */
+ charset[255], /* CHARSET env variable */
+ class_name[255],/* CLASS env variable */
+ classification[1024],
+ /* CLASSIFICATION env variable */
+ content_type[1024],
+ /* CONTENT_TYPE env variable */
+ device_uri[1024],
+ /* DEVICE_URI env variable */
+ final_content_type[1024],
+ /* FINAL_CONTENT_TYPE env variable */
+ lang[255], /* LANG env variable */
+#ifdef __APPLE__
+ apple_language[255],
+ /* APPLE_LANGUAGE env variable */
+#endif /* __APPLE__ */
+ ppd[1024], /* PPD env variable */
+ printer_info[255],
+ /* PRINTER_INFO env variable */
+ printer_location[255],
+ /* PRINTER_LOCATION env variable */
+ printer_name[255],
+ /* PRINTER env variable */
+ rip_max_cache[255];
+ /* RIP_MAX_CACHE env variable */
+
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdContinueJob(job=%p(%d)): current_file=%d, num_files=%d",
+ job, job->id, job->current_file, job->num_files);
-#ifdef HAVE_GSSAPI
/*
- * Destroy the credential cache and clear the KRB5CCNAME env var string.
+ * Figure out what filters are required to convert from
+ * the source to the destination type...
*/
- if (job->ccache)
- {
- krb5_cc_destroy(KerberosContext, job->ccache);
- job->ccache = NULL;
- }
+ FilterLevel -= job->cost;
- cupsdClearString(&job->ccname);
-#endif /* HAVE_GSSAPI */
+ filters = NULL;
- if (job->num_files > 0)
+ if (job->printer->raw)
{
- free(job->compressions);
- free(job->filetypes);
- }
-
- ippDelete(job->attrs);
+ /*
+ * Remote jobs and raw queues go directly to the printer without
+ * filtering...
+ */
- free(job);
-}
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Sending job to queue tagged as raw...");
+ filters = NULL;
+ }
+ else
+ {
+ /*
+ * Local jobs get filtered...
+ */
-/*
- * 'cupsdFinishJob()' - Finish a job.
- */
+ filters = mimeFilter(MimeDatabase, job->filetypes[job->current_file],
+ job->printer->filetype, &(job->cost));
-void
-cupsdFinishJob(cupsd_job_t *job) /* I - Job */
-{
- cupsd_printer_t *printer; /* Current printer */
- ipp_attribute_t *attr; /* job-hold-until attribute */
+ if (!filters)
+ {
+ cupsdLogJob(job, CUPSD_LOG_ERROR,
+ "Unable to convert file %d to printable format!",
+ job->current_file);
+ job->current_file ++;
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "File %d is complete.",
- job->current_file - 1);
+ if (job->current_file == job->num_files)
+ cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_DEFAULT,
+ "Aborting job because it cannot be printed.");
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "cupsdFinishJob: job->status is %d",
- job->status);
+ return;
+ }
- if (job->status_buffer &&
- (job->status < 0 || job->current_file >= job->num_files))
- {
/*
- * Close the pipe and clear the input bit.
+ * Remove NULL ("-") filters...
*/
- cupsdRemoveSelect(job->status_buffer->fd);
+ for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+ filter;
+ filter = (mime_filter_t *)cupsArrayNext(filters))
+ if (!strcmp(filter->filter, "-"))
+ cupsArrayRemove(filters, filter);
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "cupsdFinishJob: Closing status pipes [ %d %d ]...",
- job->status_pipes[0], job->status_pipes[1]);
+ if (cupsArrayCount(filters) == 0)
+ {
+ cupsArrayDelete(filters);
+ filters = NULL;
+ }
- cupsdClosePipe(job->status_pipes);
- cupsdStatBufDelete(job->status_buffer);
+ /*
+ * If this printer has any pre-filters, insert the required pre-filter
+ * in the filters array...
+ */
- job->status_buffer = NULL;
- }
+ if (job->printer->prefiltertype && filters)
+ {
+ prefilters = cupsArrayNew(NULL, NULL);
+
+ for (filter = (mime_filter_t *)cupsArrayFirst(filters);
+ filter;
+ filter = (mime_filter_t *)cupsArrayNext(filters))
+ {
+ if ((prefilter = mimeFilterLookup(MimeDatabase, filter->src,
+ job->printer->prefiltertype)))
+ {
+ cupsArrayAdd(prefilters, prefilter);
+ job->cost += prefilter->cost;
+ }
- if ((printer = job->printer) == NULL)
- printer = cupsdFindDest(job->dest);
+ cupsArrayAdd(prefilters, filter);
+ }
- update_job_attrs(job, 0);
+ cupsArrayDelete(filters);
+ filters = prefilters;
+ }
+ }
/*
- * Clear the "connecting-to-device" reason, which is only valid when a
- * printer is processing...
+ * Set a minimum cost of 100 for all jobs so that FilterLimit
+ * works with raw queues and other low-cost paths.
*/
- cupsdSetPrinterReasons(printer, "-connecting-to-device");
+ if (job->cost < 100)
+ job->cost = 100;
/*
- * Similarly, clear the "offline-report" reason for non-USB devices since we
- * rarely have current information for network devices...
+ * See if the filter cost is too high...
*/
- if (strncmp(printer->device_uri, "usb:", 4))
- cupsdSetPrinterReasons(printer, "-offline-report");
-
- if (job->status < 0)
+ if ((FilterLevel + job->cost) > FilterLimit && FilterLevel > 0 &&
+ FilterLimit > 0)
{
/*
- * Backend had errors; stop it...
+ * Don't print this job quite yet...
*/
- int exit_code; /* Exit code from backend */
-
+ cupsArrayDelete(filters);
- /*
- * Convert the status to an exit code. Due to the way the W* macros are
- * implemented on MacOS X (bug?), we have to store the exit status in a
- * variable first and then convert...
- */
+ cupsdLogJob(job, CUPSD_LOG_INFO,
+ "Holding because filter limit has been reached.");
+ cupsdLogJob(job, CUPSD_LOG_DEBUG2,
+ "cupsdContinueJob: file=%d, cost=%d, level=%d, limit=%d",
+ job->current_file, job->cost, FilterLevel,
+ FilterLimit);
+ return;
+ }
- exit_code = -job->status;
- if (WIFEXITED(exit_code))
- exit_code = WEXITSTATUS(exit_code);
- else
- exit_code = job->status;
+ FilterLevel += job->cost;
- cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)",
- exit_code,
- exit_code == CUPS_BACKEND_FAILED ? "failed" :
- exit_code == CUPS_BACKEND_AUTH_REQUIRED ?
- "authentication required" :
- exit_code == CUPS_BACKEND_HOLD ? "hold job" :
- exit_code == CUPS_BACKEND_STOP ? "stop printer" :
- exit_code == CUPS_BACKEND_CANCEL ? "cancel job" :
- exit_code < 0 ? "crashed" : "unknown");
+ /*
+ * Add decompression/raw filter as needed...
+ */
+ if ((!job->printer->raw && job->compressions[job->current_file]) ||
+ (!filters && !job->printer->remote &&
+ (job->num_files > 1 || !strncmp(job->printer->device_uri, "file:", 5))))
+ {
/*
- * Do what needs to be done...
+ * Add gziptoany filter to the front of the list...
*/
- switch (exit_code)
- {
- default :
- case CUPS_BACKEND_FAILED :
- /*
- * Backend failure, use the error-policy to determine how to
- * act...
- */
+ if (!filters)
+ filters = cupsArrayNew(NULL, NULL);
- cupsdStopJob(job, 0);
+ if (!cupsArrayInsert(filters, &gziptoany_filter))
+ {
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Unable to add decompression filter - %s", strerror(errno));
- if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
- {
- /*
- * Mark the job as pending again - we'll retry on another
- * printer...
- */
+ cupsArrayDelete(filters);
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- }
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Stopping job because the scheduler ran out of "
+ "memory.");
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ FilterLevel -= job->cost;
+ return;
+ }
+ }
- /*
- * If the job was queued to a class or the error policy is
- * "retry-current-job", try requeuing it... For faxes and retry-job
- * queues, hold the current job for 5 minutes.
- */
+ /*
+ * Add port monitor, if any...
+ */
- if ((job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) ||
- !strcmp(printer->error_policy, "retry-current-job"))
- cupsdCheckJobs();
- else if ((printer->type & CUPS_PRINTER_FAX) ||
- !strcmp(printer->error_policy, "retry-job"))
- {
- /*
- * See how many times we've tried to send the job; if more than
- * the limit, cancel the job.
- */
+ if (job->printer->port_monitor)
+ {
+ /*
+ * Add port monitor to the end of the list...
+ */
- job->tries ++;
+ if (!filters)
+ filters = cupsArrayNew(NULL, NULL);
- if (job->tries >= JobRetryLimit)
- {
- /*
- * Too many tries...
- */
+ port_monitor.src = NULL;
+ port_monitor.dst = NULL;
+ port_monitor.cost = 0;
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Canceling job since it could not be "
- "sent after %d tries.",
- JobRetryLimit);
+ snprintf(port_monitor.filter, sizeof(port_monitor.filter),
+ "%s/monitor/%s", ServerBin, job->printer->port_monitor);
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
- }
- else
- {
- /*
- * Try again in N seconds...
- */
+ if (!cupsArrayAdd(filters, &port_monitor))
+ {
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Unable to add port monitor - %s", strerror(errno));
- set_hold_until(job, time(NULL) + JobRetryInterval);
+ cupsArrayDelete(filters);
- cupsdAddEvent(CUPSD_EVENT_JOB_STATE, printer, job,
- "Job held due to fax errors; please consult "
- "the error_log file for details.");
- cupsdSetPrinterState(printer, IPP_PRINTER_IDLE, 0);
- }
- }
- else if (!strcmp(printer->error_policy, "abort-job"))
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
- else
- {
- cupsdSetPrinterState(printer, IPP_PRINTER_STOPPED, 1);
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Stopping job because the scheduler ran out of "
+ "memory.");
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
- "Job stopped due to backend errors; please consult "
- "the error_log file for details.");
- }
- break;
+ FilterLevel -= job->cost;
+ return;
+ }
+ }
- case CUPS_BACKEND_CANCEL :
- /*
- * Cancel the job...
- */
+ /*
+ * Make sure we don't go over the "MAX_FILTERS" limit...
+ */
- cupsdCancelJob(job, 0, IPP_JOB_CANCELED);
- break;
+ if (cupsArrayCount(filters) > MAX_FILTERS)
+ {
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Too many filters (%d > %d), unable to print!",
+ cupsArrayCount(filters), MAX_FILTERS);
- case CUPS_BACKEND_HOLD :
- /*
- * Hold the job...
- */
+ cupsArrayDelete(filters);
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Stopping job because it needs too many filters to "
+ "print.");
- cupsdStopJob(job, 0);
+ FilterLevel -= job->cost;
+ return;
+ }
- cupsdSetJobHoldUntil(job, "indefinite");
+ /*
+ * Determine if we are printing a banner page or not...
+ */
- job->state->values[0].integer = IPP_JOB_HELD;
- job->state_value = IPP_JOB_HELD;
+ if (job->job_sheets == NULL)
+ {
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "No job-sheets attribute.");
+ if ((job->job_sheets =
+ ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL)
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "... but someone added one without setting job_sheets!");
+ }
+ else if (job->job_sheets->num_values == 1)
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s",
+ job->job_sheets->values[0].string.text);
+ else
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s,%s",
+ job->job_sheets->values[0].string.text,
+ job->job_sheets->values[1].string.text);
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ if (job->printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))
+ banner_page = 0;
+ else if (job->job_sheets == NULL)
+ banner_page = 0;
+ else if (strcasecmp(job->job_sheets->values[0].string.text, "none") != 0 &&
+ job->current_file == 0)
+ banner_page = 1;
+ else if (job->job_sheets->num_values > 1 &&
+ strcasecmp(job->job_sheets->values[1].string.text, "none") != 0 &&
+ job->current_file == (job->num_files - 1))
+ banner_page = 1;
+ else
+ banner_page = 0;
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
- "Job held due to backend errors; please consult "
- "the error_log file for details.");
- break;
+ if ((options = get_options(job, banner_page, copies, sizeof(copies), title,
+ sizeof(title))) == NULL)
+ {
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Stopping job because the scheduler ran out of memory.");
+ cupsArrayDelete(filters);
- case CUPS_BACKEND_STOP :
- /*
- * Stop the printer...
- */
+ FilterLevel -= job->cost;
+ return;
+ }
- cupsdStopJob(job, 0);
+ /*
+ * Build the command-line arguments for the filters. Each filter
+ * has 6 or 7 arguments:
+ *
+ * argv[0] = printer
+ * argv[1] = job ID
+ * argv[2] = username
+ * argv[3] = title
+ * argv[4] = # copies
+ * argv[5] = options
+ * argv[6] = filename (optional; normally stdin)
+ *
+ * This allows legacy printer drivers that use the old System V
+ * printing interface to be used by CUPS.
+ *
+ * For remote jobs, we send all of the files in the argument list.
+ */
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
+ if (job->printer->remote)
+ argv = calloc(7 + job->num_files, sizeof(char *));
+ else
+ argv = calloc(8, sizeof(char *));
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
-
- cupsdSetPrinterState(printer, IPP_PRINTER_STOPPED, 1);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
- "Job stopped due to backend errors; please consult "
- "the error_log file for details.");
- break;
-
- case CUPS_BACKEND_AUTH_REQUIRED :
- cupsdStopJob(job, 0);
-
- cupsdSetJobHoldUntil(job, "auth-info-required");
-
- if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
- IPP_TAG_KEYWORD)) == NULL)
- attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
-
- if (attr)
- {
- attr->value_tag = IPP_TAG_KEYWORD;
- cupsdSetString(&(attr->values[0].string.text),
- "auth-info-required");
- }
-
- job->state->values[0].integer = IPP_JOB_HELD;
- job->state_value = IPP_JOB_HELD;
+ if (!argv)
+ {
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Unable to allocate argument array - %s",
+ strerror(errno));
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Stopping job because the scheduler ran out of memory.");
+ cupsArrayDelete(filters);
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ FilterLevel -= job->cost;
+ return;
+ }
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
- "Authentication is required for job %d.", job->id);
- break;
- }
+ sprintf(jobid, "%d", job->id);
- /*
- * Try printing another job...
- */
+ argv[0] = job->printer->name;
+ argv[1] = jobid;
+ argv[2] = job->username;
+ argv[3] = title;
+ argv[4] = copies;
+ argv[5] = options;
- cupsdCheckJobs();
- }
- else if (job->status > 0)
+ if (job->printer->remote && job->num_files > 1)
{
- /*
- * Filter had errors; stop job...
- */
-
- cupsdLogJob(job, CUPSD_LOG_ERROR, "Job stopped due to filter errors.");
- cupsdStopJob(job, 1);
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job,
- "Job stopped due to filter errors; please consult the "
- "error_log file for details.");
- cupsdCheckJobs();
+ for (i = 0; i < job->num_files; i ++)
+ {
+ snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
+ job->id, i + 1);
+ argv[6 + i] = strdup(filename);
+ }
}
else
{
- /*
- * Job printed successfully; cancel it...
- */
-
- if (job->current_file < job->num_files)
- {
- /*
- * Start the next file in the job...
- */
-
- FilterLevel -= job->cost;
- start_job(job, printer);
- }
- else
- {
- /*
- * Close out this job...
- */
-
- cupsdLogJob(job, CUPSD_LOG_INFO, "Completed successfully.");
- cupsdCancelJob(job, 0, IPP_JOB_COMPLETED);
- cupsdCheckJobs();
- }
+ snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
+ job->id, job->current_file + 1);
+ argv[6] = filename;
}
-}
-
-
-/*
- * 'cupsdFreeAllJobs()' - Free all jobs from memory.
- */
-
-void
-cupsdFreeAllJobs(void)
-{
- cupsd_job_t *job; /* Current job */
+ for (i = 0; argv[i]; i ++)
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "argv[%d]=\"%s\"", i, argv[i]);
- if (!Jobs)
- return;
+ /*
+ * Create environment variable strings for the filters...
+ */
- cupsdHoldSignals();
+ attr = ippFindAttribute(job->attrs, "attributes-natural-language",
+ IPP_TAG_LANGUAGE);
- cupsdStopAllJobs(1);
- cupsdSaveAllJobs();
+#ifdef __APPLE__
+ strcpy(apple_language, "APPLE_LANGUAGE=");
+ _cupsAppleLanguage(attr->values[0].string.text,
+ apple_language + 15, sizeof(apple_language) - 15);
+#endif /* __APPLE__ */
- for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
- job;
- job = (cupsd_job_t *)cupsArrayNext(Jobs))
+ switch (strlen(attr->values[0].string.text))
{
- cupsArrayRemove(Jobs, job);
- cupsArrayRemove(ActiveJobs, job);
- cupsArrayRemove(PrintingJobs, job);
-
- cupsdDeleteJob(job);
- }
-
- cupsdReleaseSignals();
-}
+ default :
+ /*
+ * This is an unknown or badly formatted language code; use
+ * the POSIX locale...
+ */
+ strcpy(lang, "LANG=C");
+ break;
-/*
- * 'cupsdFindJob()' - Find the specified job.
- */
+ case 2 :
+ /*
+ * Just the language code (ll)...
+ */
-cupsd_job_t * /* O - Job data */
-cupsdFindJob(int id) /* I - Job ID */
-{
- cupsd_job_t key; /* Search key */
+ snprintf(lang, sizeof(lang), "LANG=%s.UTF8",
+ attr->values[0].string.text);
+ break;
+ case 5 :
+ /*
+ * Language and country code (ll-cc)...
+ */
- key.id = id;
+ snprintf(lang, sizeof(lang), "LANG=%c%c_%c%c.UTF8",
+ attr->values[0].string.text[0],
+ attr->values[0].string.text[1],
+ toupper(attr->values[0].string.text[3] & 255),
+ toupper(attr->values[0].string.text[4] & 255));
+ break;
+ }
- return ((cupsd_job_t *)cupsArrayFind(Jobs, &key));
-}
+ if ((attr = ippFindAttribute(job->attrs, "document-format",
+ IPP_TAG_MIMETYPE)) != NULL &&
+ (ptr = strstr(attr->values[0].string.text, "charset=")) != NULL)
+ snprintf(charset, sizeof(charset), "CHARSET=%s", ptr + 8);
+ else
+ strlcpy(charset, "CHARSET=utf-8", sizeof(charset));
+ snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s",
+ job->filetypes[job->current_file]->super,
+ job->filetypes[job->current_file]->type);
+ snprintf(device_uri, sizeof(device_uri), "DEVICE_URI=%s",
+ job->printer->device_uri);
+ snprintf(ppd, sizeof(ppd), "PPD=%s/ppd/%s.ppd", ServerRoot,
+ job->printer->name);
+ snprintf(printer_info, sizeof(printer_name), "PRINTER_INFO=%s",
+ job->printer->info ? job->printer->info : "");
+ snprintf(printer_location, sizeof(printer_name), "PRINTER_LOCATION=%s",
+ job->printer->location ? job->printer->location : "");
+ snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", job->printer->name);
+ snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache);
-/*
- * 'cupsdGetPrinterJobCount()' - Get the number of pending, processing,
- * or held jobs in a printer or class.
- */
+ envc = cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0])));
-int /* O - Job count */
-cupsdGetPrinterJobCount(
- const char *dest) /* I - Printer or class name */
-{
- int count; /* Job count */
- cupsd_job_t *job; /* Current job */
+ envp[envc ++] = charset;
+ envp[envc ++] = lang;
+#ifdef __APPLE__
+ envp[envc ++] = apple_language;
+#endif /* __APPLE__ */
+ envp[envc ++] = ppd;
+ envp[envc ++] = rip_max_cache;
+ envp[envc ++] = content_type;
+ envp[envc ++] = device_uri;
+ envp[envc ++] = printer_info;
+ envp[envc ++] = printer_location;
+ envp[envc ++] = printer_name;
+ envp[envc ++] = banner_page ? "CUPS_FILETYPE=job-sheet" :
+ "CUPS_FILETYPE=document";
+ if (!job->printer->remote && !job->printer->raw)
+ {
+ filter = (mime_filter_t *)cupsArrayLast(filters);
- for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0;
- job;
- job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
- if (job->dest && !strcasecmp(job->dest, dest))
- count ++;
+ if (job->printer->port_monitor)
+ filter = (mime_filter_t *)cupsArrayPrev(filters);
- return (count);
-}
+ if (filter && filter->dst)
+ {
+ snprintf(final_content_type, sizeof(final_content_type),
+ "FINAL_CONTENT_TYPE=%s/%s",
+ filter->dst->super, filter->dst->type);
+ envp[envc ++] = final_content_type;
+ }
+ }
+ if (Classification && !banner_page)
+ {
+ if ((attr = ippFindAttribute(job->attrs, "job-sheets",
+ IPP_TAG_NAME)) == NULL)
+ snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
+ Classification);
+ else if (attr->num_values > 1 &&
+ strcmp(attr->values[1].string.text, "none") != 0)
+ snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
+ attr->values[1].string.text);
+ else
+ snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
+ attr->values[0].string.text);
-/*
- * 'cupsdGetUserJobCount()' - Get the number of pending, processing,
- * or held jobs for a user.
- */
+ envp[envc ++] = classification;
+ }
-int /* O - Job count */
-cupsdGetUserJobCount(
- const char *username) /* I - Username */
-{
- int count; /* Job count */
- cupsd_job_t *job; /* Current job */
+ if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
+ {
+ snprintf(class_name, sizeof(class_name), "CLASS=%s", job->dest);
+ envp[envc ++] = class_name;
+ }
+ if (job->auth_username)
+ envp[envc ++] = job->auth_username;
+ if (job->auth_domain)
+ envp[envc ++] = job->auth_domain;
+ if (job->auth_password)
+ envp[envc ++] = job->auth_password;
- for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0;
- job;
- job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
- if (!strcasecmp(job->username, username))
- count ++;
+#ifdef HAVE_GSSAPI
+ if (job->ccname)
+ envp[envc ++] = job->ccname;
+#endif /* HAVE_GSSAPI */
- return (count);
-}
+ envp[envc] = NULL;
+ for (i = 0; i < envc; i ++)
+ if (!strncmp(envp[i], "AUTH_", 5))
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"AUTH_%c****\"", i,
+ envp[i][5]);
+ else if (strncmp(envp[i], "DEVICE_URI=", 11))
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"%s\"", i, envp[i]);
+ else
+ cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"DEVICE_URI=%s\"", i,
+ job->printer->sanitized_device_uri);
-/*
- * 'cupsdHoldJob()' - Hold the specified job.
- */
+ if (job->printer->remote)
+ job->current_file = job->num_files;
+ else
+ job->current_file ++;
-void
-cupsdHoldJob(cupsd_job_t *job) /* I - Job data */
-{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdHoldJob: id = %d", job->id);
+ /*
+ * Now create processes for all of the filters...
+ */
- if (job->state_value == IPP_JOB_PROCESSING)
- cupsdStopJob(job, 0);
- else
- cupsdLoadJob(job);
+ filterfds[0][0] = -1;
+ filterfds[0][1] = -1;
+ filterfds[1][0] = -1;
+ filterfds[1][1] = -1;
- DEBUG_puts("cupsdHoldJob: setting state to held...");
+ memset(job->filters, 0, sizeof(job->filters));
- job->state->values[0].integer = IPP_JOB_HELD;
- job->state_value = IPP_JOB_HELD;
- job->current_file = 0;
+ for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
+ filter;
+ i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
+ {
+ if (filter->filter[0] != '/')
+ snprintf(command, sizeof(command), "%s/filter/%s", ServerBin,
+ filter->filter);
+ else
+ strlcpy(command, filter->filter, sizeof(command));
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
-}
+ if (i < (cupsArrayCount(filters) - 1))
+ {
+ if (cupsdOpenPipe(filterfds[slot]))
+ {
+ abort_message = "Stopping job because the scheduler could not create "
+ "the filter pipes.";
+ goto abort_job;
+ }
+ }
+ else
+ {
+ if (job->current_file == 1)
+ {
+ if (strncmp(job->printer->device_uri, "file:", 5) != 0)
+ {
+ if (cupsdOpenPipe(job->print_pipes))
+ {
+ abort_message = "Stopping job because the scheduler could not "
+ "create the backend pipes.";
-/*
- * 'cupsdLoadAllJobs()' - Load all jobs from disk.
- */
+ goto abort_job;
+ }
+ }
+ else
+ {
+ job->print_pipes[0] = -1;
+ if (!strcmp(job->printer->device_uri, "file:/dev/null") ||
+ !strcmp(job->printer->device_uri, "file:///dev/null"))
+ job->print_pipes[1] = -1;
+ else
+ {
+ if (!strncmp(job->printer->device_uri, "file:/dev/", 10))
+ job->print_pipes[1] = open(job->printer->device_uri + 5,
+ O_WRONLY | O_EXCL);
+ else if (!strncmp(job->printer->device_uri, "file:///dev/", 12))
+ job->print_pipes[1] = open(job->printer->device_uri + 7,
+ O_WRONLY | O_EXCL);
+ else if (!strncmp(job->printer->device_uri, "file:///", 8))
+ job->print_pipes[1] = open(job->printer->device_uri + 7,
+ O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ else
+ job->print_pipes[1] = open(job->printer->device_uri + 5,
+ O_WRONLY | O_CREAT | O_TRUNC, 0600);
-void
-cupsdLoadAllJobs(void)
-{
- char filename[1024]; /* Full filename of job.cache file */
- struct stat fileinfo, /* Information on job.cache file */
- dirinfo; /* Information on RequestRoot dir */
+ if (job->print_pipes[1] < 0)
+ {
+ abort_message = "Stopping job because the scheduler could not "
+ "open the output file.";
+ goto abort_job;
+ }
+ fcntl(job->print_pipes[1], F_SETFD,
+ fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC);
+ }
+ }
+ }
- /*
- * Create the job arrays as needed...
- */
+ filterfds[slot][0] = job->print_pipes[0];
+ filterfds[slot][1] = job->print_pipes[1];
+ }
- if (!Jobs)
- Jobs = cupsArrayNew(compare_jobs, NULL);
+ 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);
- if (!ActiveJobs)
- ActiveJobs = cupsArrayNew(compare_active_jobs, NULL);
+ cupsdClosePipe(filterfds[!slot]);
- if (!PrintingJobs)
- PrintingJobs = cupsArrayNew(compare_jobs, NULL);
+ if (pid == 0)
+ {
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.",
+ filter->filter, strerror(errno));
- /*
- * See whether the job.cache file is older than the RequestRoot directory...
- */
+ abort_message = "Stopped job because the scheduler could not execute a "
+ "filter.";
- snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir);
+ goto abort_job;
+ }
- if (stat(filename, &fileinfo))
- {
- fileinfo.st_mtime = 0;
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command,
+ pid);
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to get file information for \"%s\" - %s",
- filename, strerror(errno));
+ argv[6] = NULL;
+ slot = !slot;
}
- if (stat(RequestRoot, &dirinfo))
- {
- dirinfo.st_mtime = 0;
-
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to get directory information for \"%s\" - %s",
- RequestRoot, strerror(errno));
- }
+ cupsArrayDelete(filters);
+ filters = NULL;
/*
- * Load the most recent source for job data...
+ * Finally, pipe the final output into a backend process if needed...
*/
- if (dirinfo.st_mtime > fileinfo.st_mtime)
+ if (strncmp(job->printer->device_uri, "file:", 5) != 0)
{
- load_request_root();
+ if (job->current_file == 1 || job->printer->remote)
+ {
+ sscanf(job->printer->device_uri, "%254[^:]", scheme);
+ snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, scheme);
- load_next_job_id(filename);
- }
- else
- load_job_cache(filename);
+ /*
+ * See if the backend needs to run as root...
+ */
- /*
- * Clean out old jobs as needed...
- */
+ if (RunUser)
+ backroot = 0;
+ else if (stat(command, &backinfo))
+ backroot = 0;
+ else
+ backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO));
- if (MaxJobs > 0 && cupsArrayCount(Jobs) >= MaxJobs)
- cupsdCleanJobs();
-}
+ argv[0] = job->printer->sanitized_device_uri;
+ filterfds[slot][0] = -1;
+ filterfds[slot][1] = -1;
-/*
- * 'cupsdLoadJob()' - Load a single job...
- */
+ 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));
-int /* O - 1 on success, 0 on failure */
-cupsdLoadJob(cupsd_job_t *job) /* I - Job */
-{
- char jobfile[1024]; /* Job filename */
- cups_file_t *fp; /* Job file */
- int fileid; /* Current file ID */
- ipp_attribute_t *attr; /* Job attribute */
- const char *dest; /* Destination name */
- cupsd_printer_t *destptr; /* Pointer to destination */
- mime_type_t **filetypes; /* New filetypes array */
- int *compressions; /* New compressions array */
+ if (pid == 0)
+ {
+ abort_message = "Stopping job because the sheduler could not execute "
+ "the backend.";
+
+ goto abort_job;
+ }
+ else
+ {
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Started backend %s (PID %d)",
+ command, pid);
+ }
+ }
+ if (job->current_file == job->num_files)
+ {
+ cupsdClosePipe(job->print_pipes);
+ cupsdClosePipe(job->back_pipes);
+ cupsdClosePipe(job->side_pipes);
- if (job->attrs)
+ close(job->status_pipes[1]);
+ job->status_pipes[1] = -1;
+ }
+ }
+ else
{
- if (job->state_value > IPP_JOB_STOPPED)
- job->access_time = time(NULL);
+ filterfds[slot][0] = -1;
+ filterfds[slot][1] = -1;
- return (1);
+ if (job->current_file == job->num_files)
+ {
+ cupsdClosePipe(job->print_pipes);
+
+ close(job->status_pipes[1]);
+ job->status_pipes[1] = -1;
+ }
}
- if ((job->attrs = ippNew()) == NULL)
+ cupsdClosePipe(filterfds[slot]);
+
+ if (job->printer->remote && job->num_files > 1)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Ran out of memory for job attributes!", job->id);
- return (0);
+ for (i = 0; i < job->num_files; i ++)
+ free(argv[i + 6]);
}
- /*
- * Load job attributes...
- */
+ free(argv);
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id);
+ cupsdAddSelect(job->status_buffer->fd, (cupsd_selfunc_t)update_job, NULL,
+ job);
- snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id);
- if ((fp = cupsFileOpen(jobfile, "r")) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to open job control file \"%s\" - %s!",
- job->id, jobfile, strerror(errno));
- goto error;
- }
+ cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.",
+ job->id);
- if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to read job control file \"%s\"!", job->id,
- jobfile);
- cupsFileClose(fp);
- goto error;
- }
+ return;
- cupsFileClose(fp);
/*
- * Copy attribute data to the job object...
+ * If we get here, we need to abort the current job and close out all
+ * files and pipes...
*/
- if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad time-at-creation attribute in "
- "control file!", job->id);
- goto error;
- }
+ abort_job:
- if ((job->state = ippFindAttribute(job->attrs, "job-state",
- IPP_TAG_ENUM)) == NULL)
+ for (slot = 0; slot < 2; slot ++)
+ cupsdClosePipe(filterfds[slot]);
+
+ cupsdClosePipe(job->status_pipes);
+ cupsdStatBufDelete(job->status_buffer);
+ job->status_buffer = NULL;
+
+ cupsArrayDelete(filters);
+
+ if (job->printer->remote && job->num_files > 1)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad job-state attribute in control "
- "file!", job->id);
- goto error;
+ for (i = 0; i < job->num_files; i ++)
+ free(argv[i + 6]);
}
- job->state_value = (ipp_jstate_t)job->state->values[0].integer;
+ free(argv);
- if (!job->dest)
- {
- if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
- IPP_TAG_URI)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] No job-printer-uri attribute in control file!",
- job->id);
- goto error;
- }
-
- if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype),
- &destptr)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to queue job for destination \"%s\"!",
- job->id, attr->values[0].string.text);
- goto error;
- }
-
- cupsdSetString(&job->dest, dest);
- }
- else if ((destptr = cupsdFindDest(job->dest)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to queue job for destination \"%s\"!",
- job->id, job->dest);
- goto error;
- }
-
- job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed",
- IPP_TAG_INTEGER);
- job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
-
- if (!job->priority)
- {
- if ((attr = ippFindAttribute(job->attrs, "job-priority",
- IPP_TAG_INTEGER)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad job-priority attribute in "
- "control file!", job->id);
- goto error;
- }
-
- job->priority = attr->values[0].integer;
- }
-
- if (!job->username)
- {
- if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name",
- IPP_TAG_NAME)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Missing or bad job-originating-user-name "
- "attribute in control file!", job->id);
- goto error;
- }
-
- cupsdSetString(&job->username, attr->values[0].string.text);
- }
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, "%s",
+ abort_message);
+}
- /*
- * Set the job hold-until time and state...
- */
- if (job->state_value == IPP_JOB_HELD)
- {
- if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
- IPP_TAG_KEYWORD)) == NULL)
- attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
+/*
+ * 'cupsdDeleteJob()' - Free all memory used by a job.
+ */
- if (attr)
- cupsdSetJobHoldUntil(job, attr->values[0].string.text);
- else
- {
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- }
- }
- else if (job->state_value == IPP_JOB_PROCESSING)
- {
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- }
+void
+cupsdDeleteJob(cupsd_job_t *job, /* I - Job */
+ cupsd_jobaction_t action)/* I - Action */
+{
+ if (job->printer)
+ finalize_job(job);
- if (!job->num_files)
+ if (action == CUPSD_JOB_PURGE)
{
/*
- * Find all the d##### files...
+ * Remove the job info file...
*/
- for (fileid = 1; fileid < 10000; fileid ++)
- {
- snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
- job->id, fileid);
-
- if (access(jobfile, 0))
- break;
-
- cupsdLogMessage(CUPSD_LOG_DEBUG,
- "[Job %d] Auto-typing document file \"%s\"...", job->id,
- jobfile);
-
- if (fileid > job->num_files)
- {
- if (job->num_files == 0)
- {
- compressions = (int *)calloc(fileid, sizeof(int));
- filetypes = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *));
- }
- else
- {
- compressions = (int *)realloc(job->compressions,
- sizeof(int) * fileid);
- filetypes = (mime_type_t **)realloc(job->filetypes,
- sizeof(mime_type_t *) *
- fileid);
- }
-
- if (!compressions || !filetypes)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Ran out of memory for job file types!",
- job->id);
- return (1);
- }
-
- job->compressions = compressions;
- job->filetypes = filetypes;
- job->num_files = fileid;
- }
-
- job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL,
- job->compressions + fileid - 1);
+ char filename[1024]; /* Job filename */
- if (!job->filetypes[fileid - 1])
- job->filetypes[fileid - 1] = mimeType(MimeDatabase, "application",
- "vnd.cups-raw");
- }
+ snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot,
+ job->id);
+ unlink(filename);
}
+ cupsdClearString(&job->username);
+ cupsdClearString(&job->dest);
+ cupsdClearString(&job->auth_username);
+ cupsdClearString(&job->auth_domain);
+ cupsdClearString(&job->auth_password);
+
+#ifdef HAVE_GSSAPI
/*
- * Load authentication information as needed...
+ * Destroy the credential cache and clear the KRB5CCNAME env var string.
*/
- if (job->state_value < IPP_JOB_STOPPED)
+ if (job->ccache)
{
- snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id);
-
- cupsdClearString(&job->auth_username);
- cupsdClearString(&job->auth_domain);
- cupsdClearString(&job->auth_password);
-
- if ((fp = cupsFileOpen(jobfile, "r")) != NULL)
- {
- int i, /* Looping var */
- bytes; /* Size of auth data */
- char line[255], /* Line from file */
- data[255]; /* Decoded data */
-
+ krb5_cc_destroy(KerberosContext, job->ccache);
+ job->ccache = NULL;
+ }
- for (i = 0;
- i < destptr->num_auth_info_required &&
- cupsFileGets(fp, line, sizeof(line));
- i ++)
- {
- bytes = sizeof(data);
- httpDecode64_2(data, &bytes, line);
+ cupsdClearString(&job->ccname);
+#endif /* HAVE_GSSAPI */
- if (!strcmp(destptr->auth_info_required[i], "username"))
- cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", data);
- else if (!strcmp(destptr->auth_info_required[i], "domain"))
- cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s", data);
- else if (!strcmp(destptr->auth_info_required[i], "password"))
- cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", data);
- }
+ if (job->num_files > 0)
+ {
+ free(job->compressions);
+ free(job->filetypes);
- cupsFileClose(fp);
- }
+ job->num_files = 0;
}
- job->access_time = time(NULL);
- return (1);
-
- /*
- * If we get here then something bad happened...
- */
+ unload_job(job);
- error:
+ cupsArrayRemove(Jobs, job);
+ cupsArrayRemove(ActiveJobs, job);
+ cupsArrayRemove(PrintingJobs, job);
- ippDelete(job->attrs);
- job->attrs = NULL;
- unlink(jobfile);
- return (0);
+ free(job);
}
/*
- * 'cupsdMoveJob()' - Move the specified job to a different destination.
+ * 'cupsdFreeAllJobs()' - Free all jobs from memory.
*/
void
-cupsdMoveJob(cupsd_job_t *job, /* I - Job */
- cupsd_printer_t *p) /* I - Destination printer or class */
+cupsdFreeAllJobs(void)
{
- ipp_attribute_t *attr; /* job-printer-uri attribute */
- const char *olddest; /* Old destination */
- cupsd_printer_t *oldp; /* Old pointer */
-
+ cupsd_job_t *job; /* Current job */
- /*
- * Don't move completed jobs...
- */
- if (job->state_value > IPP_JOB_STOPPED)
+ if (!Jobs)
return;
- /*
- * Get the old destination...
- */
+ cupsdHoldSignals();
- olddest = job->dest;
+ cupsdStopAllJobs(1);
+ cupsdSaveAllJobs();
- if (job->printer)
- oldp = job->printer;
- else
- oldp = cupsdFindDest(olddest);
+ for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(Jobs))
+ cupsdDeleteJob(job, CUPSD_JOB_DEFAULT);
- /*
- * Change the destination information...
- */
+ cupsdReleaseSignals();
+}
- if (job->state_value == IPP_JOB_PROCESSING)
- cupsdStopJob(job, 0);
- else
- cupsdLoadJob(job);
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, oldp, job,
- "Job #%d moved from %s to %s.", job->id, olddest,
- p->name);
+/*
+ * 'cupsdFindJob()' - Find the specified job.
+ */
- cupsdSetString(&job->dest, p->name);
- job->dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE |
- CUPS_PRINTER_IMPLICIT);
+cupsd_job_t * /* O - Job data */
+cupsdFindJob(int id) /* I - Job ID */
+{
+ cupsd_job_t key; /* Search key */
- if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
- IPP_TAG_URI)) != NULL)
- cupsdSetString(&(attr->values[0].string.text), p->uri);
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job,
- "Job #%d moved from %s to %s.", job->id, olddest,
- p->name);
+ key.id = id;
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ return ((cupsd_job_t *)cupsArrayFind(Jobs, &key));
}
/*
- * 'cupsdReleaseJob()' - Release the specified job.
+ * 'cupsdGetPrinterJobCount()' - Get the number of pending, processing,
+ * or held jobs in a printer or class.
*/
-void
-cupsdReleaseJob(cupsd_job_t *job) /* I - Job */
+int /* O - Job count */
+cupsdGetPrinterJobCount(
+ const char *dest) /* I - Printer or class name */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob: id = %d", job->id);
-
- if (job->state_value == IPP_JOB_HELD)
- {
- /*
- * Add trailing banner as needed...
- */
+ int count; /* Job count */
+ cupsd_job_t *job; /* Current job */
- if (job->pending_timeout)
- cupsdTimeoutJob(job);
- DEBUG_puts("cupsdReleaseJob: setting state to pending...");
+ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0;
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
+ if (job->dest && !strcasecmp(job->dest, dest))
+ count ++;
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
- }
+ return (count);
}
/*
- * 'cupsdRestartJob()' - Restart the specified job.
+ * 'cupsdGetUserJobCount()' - Get the number of pending, processing,
+ * or held jobs for a user.
*/
-void
-cupsdRestartJob(cupsd_job_t *job) /* I - Job */
+int /* O - Job count */
+cupsdGetUserJobCount(
+ const char *username) /* I - Username */
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob: id = %d", job->id);
-
- if (job->state_value == IPP_JOB_STOPPED || job->num_files)
- {
- ipp_jstate_t old_state; /* Old job state */
-
-
- cupsdLoadJob(job);
-
- old_state = job->state_value;
+ int count; /* Job count */
+ cupsd_job_t *job; /* Current job */
- job->tries = 0;
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0;
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
+ if (!strcasecmp(job->username, username))
+ count ++;
- if (old_state > IPP_JOB_STOPPED)
- cupsArrayAdd(ActiveJobs, job);
- }
+ return (count);
}
/*
- * 'cupsdSaveAllJobs()' - Save a summary of all jobs to disk.
+ * 'cupsdLoadAllJobs()' - Load all jobs from disk.
*/
void
-cupsdSaveAllJobs(void)
+cupsdLoadAllJobs(void)
{
- int i; /* Looping var */
- cups_file_t *fp; /* Job cache file */
- char temp[1024]; /* Temporary string */
- cupsd_job_t *job; /* Current job */
- time_t curtime; /* Current time */
- struct tm *curdate; /* Current date */
-
+ char filename[1024]; /* Full filename of job.cache file */
+ struct stat fileinfo, /* Information on job.cache file */
+ dirinfo; /* Information on RequestRoot dir */
- snprintf(temp, sizeof(temp), "%s/job.cache", CacheDir);
- if ((fp = cupsFileOpen(temp, "w")) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to create job cache file \"%s\" - %s",
- temp, strerror(errno));
- return;
- }
- cupsdLogMessage(CUPSD_LOG_INFO, "Saving job cache file \"%s\"...", temp);
/*
- * Restrict access to the file...
+ * Create the job arrays as needed...
*/
- fchown(cupsFileNumber(fp), getuid(), Group);
- fchmod(cupsFileNumber(fp), ConfigFilePerm);
+ if (!Jobs)
+ Jobs = cupsArrayNew(compare_jobs, NULL);
+
+ if (!ActiveJobs)
+ ActiveJobs = cupsArrayNew(compare_active_jobs, NULL);
+
+ if (!PrintingJobs)
+ PrintingJobs = cupsArrayNew(compare_jobs, NULL);
/*
- * Write a small header to the file...
+ * See whether the job.cache file is older than the RequestRoot directory...
*/
- curtime = time(NULL);
- curdate = localtime(&curtime);
- strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate);
+ snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir);
- cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n");
- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
- cupsFilePrintf(fp, "NextJobId %d\n", NextJobId);
+ if (stat(filename, &fileinfo))
+ {
+ fileinfo.st_mtime = 0;
+
+ if (errno != ENOENT)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to get file information for \"%s\" - %s",
+ filename, strerror(errno));
+ }
+
+ if (stat(RequestRoot, &dirinfo))
+ {
+ dirinfo.st_mtime = 0;
+
+ if (errno != ENOENT)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to get directory information for \"%s\" - %s",
+ RequestRoot, strerror(errno));
+ }
/*
- * Write each job known to the system...
+ * Load the most recent source for job data...
*/
- for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
- job;
- job = (cupsd_job_t *)cupsArrayNext(Jobs))
+ if (dirinfo.st_mtime > fileinfo.st_mtime)
{
- cupsFilePrintf(fp, "<Job %d>\n", job->id);
- cupsFilePrintf(fp, "State %d\n", job->state_value);
- cupsFilePrintf(fp, "Priority %d\n", job->priority);
- cupsFilePrintf(fp, "Username %s\n", job->username);
- cupsFilePrintf(fp, "Destination %s\n", job->dest);
- cupsFilePrintf(fp, "DestType %d\n", job->dtype);
- cupsFilePrintf(fp, "NumFiles %d\n", job->num_files);
- for (i = 0; i < job->num_files; i ++)
- cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super,
- job->filetypes[i]->type, job->compressions[i]);
- cupsFilePuts(fp, "</Job>\n");
+ load_request_root();
+
+ load_next_job_id(filename);
}
+ else
+ load_job_cache(filename);
- cupsFileClose(fp);
+ /*
+ * Clean out old jobs as needed...
+ */
+
+ if (MaxJobs > 0 && cupsArrayCount(Jobs) >= MaxJobs)
+ cupsdCleanJobs();
}
/*
- * 'cupsdSaveJob()' - Save a job to disk.
+ * 'cupsdLoadJob()' - Load a single job.
*/
-void
-cupsdSaveJob(cupsd_job_t *job) /* I - Job */
+int /* O - 1 on success, 0 on failure */
+cupsdLoadJob(cupsd_job_t *job) /* I - Job */
{
- char filename[1024]; /* Job control filename */
- cups_file_t *fp; /* Job file */
+ char jobfile[1024]; /* Job filename */
+ cups_file_t *fp; /* Job file */
+ int fileid; /* Current file ID */
+ ipp_attribute_t *attr; /* Job attribute */
+ const char *dest; /* Destination name */
+ cupsd_printer_t *destptr; /* Pointer to destination */
+ mime_type_t **filetypes; /* New filetypes array */
+ int *compressions; /* New compressions array */
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p",
- job, job->id, job->attrs);
+ if (job->attrs)
+ {
+ if (job->state_value > IPP_JOB_STOPPED)
+ job->access_time = time(NULL);
- snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, job->id);
+ return (1);
+ }
- if ((fp = cupsFileOpen(filename, "w")) == NULL)
+ if ((job->attrs = ippNew()) == NULL)
{
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to create job control file \"%s\" - %s.",
- job->id, filename, strerror(errno));
- return;
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "Ran out of memory for job attributes!");
+ return (0);
}
- fchmod(cupsFileNumber(fp), 0600);
- fchown(cupsFileNumber(fp), RunUser, Group);
+ /*
+ * Load job attributes...
+ */
- job->attrs->state = IPP_IDLE;
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id);
- if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
- job->attrs) != IPP_DATA)
+ snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id);
+ if ((fp = cupsFileOpen(jobfile, "r")) == NULL)
+ {
cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unable to write job control file!", job->id);
-
- cupsFileClose(fp);
-
- job->dirty = 0;
-}
-
-
-/*
- * 'cupsdSetJobHoldUntil()' - Set the hold time for a job...
- */
-
-void
-cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */
- const char *when) /* I - When to resume */
-{
- time_t curtime; /* Current time */
- struct tm *curdate; /* Current date */
- int hour; /* Hold hour */
- int minute; /* Hold minute */
- int second; /* Hold second */
+ "[Job %d] Unable to open job control file \"%s\" - %s!",
+ job->id, jobfile, strerror(errno));
+ goto error;
+ }
+ if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Unable to read job control file \"%s\"!", job->id,
+ jobfile);
+ cupsFileClose(fp);
+ goto error;
+ }
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil(%d, \"%s\")",
- job->id, when);
+ cupsFileClose(fp);
- second = 0;
+ /*
+ * Copy attribute data to the job object...
+ */
- if (!strcmp(when, "indefinite") || !strcmp(when, "auth-info-required"))
+ if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER))
{
- /*
- * Hold indefinitely...
- */
-
- job->hold_until = 0;
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Missing or bad time-at-creation attribute in "
+ "control file!", job->id);
+ goto error;
}
- else if (!strcmp(when, "day-time"))
+
+ if ((job->state = ippFindAttribute(job->attrs, "job-state",
+ IPP_TAG_ENUM)) == NULL)
{
- /*
- * Hold to 6am the next morning unless local time is < 6pm.
- */
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Missing or bad job-state attribute in control "
+ "file!", job->id);
+ goto error;
+ }
- curtime = time(NULL);
- curdate = localtime(&curtime);
+ job->state_value = (ipp_jstate_t)job->state->values[0].integer;
- if (curdate->tm_hour < 18)
- job->hold_until = curtime;
- else
- job->hold_until = curtime +
- ((29 - curdate->tm_hour) * 60 + 59 -
- curdate->tm_min) * 60 + 60 - curdate->tm_sec;
- }
- else if (!strcmp(when, "evening") || !strcmp(when, "night"))
+ if (!job->dest)
{
- /*
- * Hold to 6pm unless local time is > 6pm or < 6am.
- */
+ if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
+ IPP_TAG_URI)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] No job-printer-uri attribute in control file!",
+ job->id);
+ goto error;
+ }
- curtime = time(NULL);
- curdate = localtime(&curtime);
+ if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype),
+ &destptr)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Unable to queue job for destination \"%s\"!",
+ job->id, attr->values[0].string.text);
+ goto error;
+ }
- if (curdate->tm_hour < 6 || curdate->tm_hour >= 18)
- job->hold_until = curtime;
- else
- job->hold_until = curtime +
- ((17 - curdate->tm_hour) * 60 + 59 -
- curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ cupsdSetString(&job->dest, dest);
}
- else if (!strcmp(when, "second-shift"))
+ else if ((destptr = cupsdFindDest(job->dest)) == NULL)
{
- /*
- * Hold to 4pm unless local time is > 4pm.
- */
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Unable to queue job for destination \"%s\"!",
+ job->id, job->dest);
+ goto error;
+ }
- curtime = time(NULL);
- curdate = localtime(&curtime);
+ job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed",
+ IPP_TAG_INTEGER);
+ job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME);
- if (curdate->tm_hour >= 16)
- job->hold_until = curtime;
- else
- job->hold_until = curtime +
- ((15 - curdate->tm_hour) * 60 + 59 -
- curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ if (!job->priority)
+ {
+ if ((attr = ippFindAttribute(job->attrs, "job-priority",
+ IPP_TAG_INTEGER)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Missing or bad job-priority attribute in "
+ "control file!", job->id);
+ goto error;
+ }
+
+ job->priority = attr->values[0].integer;
}
- else if (!strcmp(when, "third-shift"))
+
+ if (!job->username)
{
- /*
- * Hold to 12am unless local time is < 8am.
- */
+ if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name",
+ IPP_TAG_NAME)) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Missing or bad job-originating-user-name "
+ "attribute in control file!", job->id);
+ goto error;
+ }
- curtime = time(NULL);
- curdate = localtime(&curtime);
+ cupsdSetString(&job->username, attr->values[0].string.text);
+ }
- if (curdate->tm_hour < 8)
- job->hold_until = curtime;
+ /*
+ * Set the job hold-until time and state...
+ */
+
+ if (job->state_value == IPP_JOB_HELD)
+ {
+ if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
+ IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
+
+ if (attr)
+ cupsdSetJobHoldUntil(job, attr->values[0].string.text, CUPSD_JOB_DEFAULT);
else
- job->hold_until = curtime +
- ((23 - curdate->tm_hour) * 60 + 59 -
- curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ {
+ job->state->values[0].integer = IPP_JOB_PENDING;
+ job->state_value = IPP_JOB_PENDING;
+ }
}
- else if (!strcmp(when, "weekend"))
+ else if (job->state_value == IPP_JOB_PROCESSING)
+ {
+ job->state->values[0].integer = IPP_JOB_PENDING;
+ job->state_value = IPP_JOB_PENDING;
+ }
+
+ if (!job->num_files)
{
/*
- * Hold to weekend unless we are in the weekend.
+ * Find all the d##### files...
*/
- curtime = time(NULL);
- curdate = localtime(&curtime);
+ for (fileid = 1; fileid < 10000; fileid ++)
+ {
+ snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
+ job->id, fileid);
- if (curdate->tm_wday == 0 || curdate->tm_wday == 6)
- job->hold_until = curtime;
- else
- job->hold_until = curtime +
- (((5 - curdate->tm_wday) * 24 +
- (17 - curdate->tm_hour)) * 60 + 59 -
- curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ if (access(jobfile, 0))
+ break;
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "[Job %d] Auto-typing document file \"%s\"...", job->id,
+ jobfile);
+
+ if (fileid > job->num_files)
+ {
+ if (job->num_files == 0)
+ {
+ compressions = (int *)calloc(fileid, sizeof(int));
+ filetypes = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *));
+ }
+ else
+ {
+ compressions = (int *)realloc(job->compressions,
+ sizeof(int) * fileid);
+ filetypes = (mime_type_t **)realloc(job->filetypes,
+ sizeof(mime_type_t *) *
+ fileid);
+ }
+
+ if (!compressions || !filetypes)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Ran out of memory for job file types!",
+ job->id);
+ return (1);
+ }
+
+ job->compressions = compressions;
+ job->filetypes = filetypes;
+ job->num_files = fileid;
+ }
+
+ job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL,
+ job->compressions + fileid - 1);
+
+ if (!job->filetypes[fileid - 1])
+ job->filetypes[fileid - 1] = mimeType(MimeDatabase, "application",
+ "vnd.cups-raw");
+ }
}
- else if (sscanf(when, "%d:%d:%d", &hour, &minute, &second) >= 2)
+
+ /*
+ * Load authentication information as needed...
+ */
+
+ if (job->state_value < IPP_JOB_STOPPED)
{
- /*
- * Hold to specified GMT time (HH:MM or HH:MM:SS)...
- */
+ snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id);
- curtime = time(NULL);
- curdate = gmtime(&curtime);
+ cupsdClearString(&job->auth_username);
+ cupsdClearString(&job->auth_domain);
+ cupsdClearString(&job->auth_password);
- job->hold_until = curtime +
- ((hour - curdate->tm_hour) * 60 + minute -
- curdate->tm_min) * 60 + second - curdate->tm_sec;
+ if ((fp = cupsFileOpen(jobfile, "r")) != NULL)
+ {
+ int i, /* Looping var */
+ bytes; /* Size of auth data */
+ char line[255], /* Line from file */
+ data[255]; /* Decoded data */
- /*
- * Hold until next day as needed...
- */
- if (job->hold_until < curtime)
- job->hold_until += 24 * 60 * 60;
+ for (i = 0;
+ i < destptr->num_auth_info_required &&
+ cupsFileGets(fp, line, sizeof(line));
+ i ++)
+ {
+ bytes = sizeof(data);
+ httpDecode64_2(data, &bytes, line);
+
+ if (!strcmp(destptr->auth_info_required[i], "username"))
+ cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", data);
+ else if (!strcmp(destptr->auth_info_required[i], "domain"))
+ cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s", data);
+ else if (!strcmp(destptr->auth_info_required[i], "password"))
+ cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", data);
+ }
+
+ cupsFileClose(fp);
+ }
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until = %d",
- (int)job->hold_until);
+ job->access_time = time(NULL);
+ return (1);
+
+ /*
+ * If we get here then something bad happened...
+ */
+
+ error:
+
+ ippDelete(job->attrs);
+ job->attrs = NULL;
+ unlink(jobfile);
+
+ return (0);
}
/*
- * 'cupsdSetJobPriority()' - Set the priority of a job, moving it up/down in
- * the list as needed.
+ * 'cupsdMoveJob()' - Move the specified job to a different destination.
*/
void
-cupsdSetJobPriority(
- cupsd_job_t *job, /* I - Job ID */
- int priority) /* I - New priority (0 to 100) */
+cupsdMoveJob(cupsd_job_t *job, /* I - Job */
+ cupsd_printer_t *p) /* I - Destination printer or class */
{
- ipp_attribute_t *attr; /* Job attribute */
+ ipp_attribute_t *attr; /* job-printer-uri attribute */
+ const char *olddest; /* Old destination */
+ cupsd_printer_t *oldp; /* Old pointer */
/*
- * Don't change completed jobs...
+ * Don't move completed jobs...
*/
- if (job->state_value >= IPP_JOB_PROCESSING)
+ if (job->state_value > IPP_JOB_STOPPED)
return;
/*
- * Set the new priority and re-add the job into the active list...
+ * Get the old destination...
*/
- cupsArrayRemove(ActiveJobs, job);
-
- job->priority = priority;
+ olddest = job->dest;
- if ((attr = ippFindAttribute(job->attrs, "job-priority",
- IPP_TAG_INTEGER)) != NULL)
- attr->values[0].integer = priority;
+ if (job->printer)
+ oldp = job->printer;
else
- ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority",
- priority);
+ oldp = cupsdFindDest(olddest);
- cupsArrayAdd(ActiveJobs, job);
+ /*
+ * Change the destination information...
+ */
+
+ cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT,
+ "Stopping job prior to move.");
+
+ cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, oldp, job,
+ "Job #%d moved from %s to %s.", job->id, olddest,
+ p->name);
+
+ cupsdSetString(&job->dest, p->name);
+ job->dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE |
+ CUPS_PRINTER_IMPLICIT);
+
+ if ((attr = ippFindAttribute(job->attrs, "job-printer-uri",
+ IPP_TAG_URI)) != NULL)
+ cupsdSetString(&(attr->values[0].string.text), p->uri);
+
+ cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job,
+ "Job #%d moved from %s to %s.", job->id, olddest,
+ p->name);
job->dirty = 1;
cupsdMarkDirty(CUPSD_DIRTY_JOBS);
/*
- * 'cupsdStopAllJobs()' - Stop all print jobs.
+ * 'cupsdReleaseJob()' - Release the specified job.
*/
void
-cupsdStopAllJobs(int force) /* I - 1 = Force all filters to stop */
+cupsdReleaseJob(cupsd_job_t *job) /* I - Job */
{
- cupsd_job_t *job; /* Current job */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob(job=%p(%d))", job,
+ job->id);
+ if (job->state_value == IPP_JOB_HELD)
+ {
+ /*
+ * Add trailing banner as needed...
+ */
- DEBUG_puts("cupsdStopAllJobs()");
+ if (job->pending_timeout)
+ cupsdTimeoutJob(job);
- for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
- job;
- job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
- if (job->state_value == IPP_JOB_PROCESSING)
- {
- cupsdStopJob(job, force);
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- }
+ cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT,
+ "Job released by user.");
+ }
}
/*
- * 'cupsdStopJob()' - Stop a print job.
+ * 'cupsdRestartJob()' - Restart the specified job.
*/
void
-cupsdStopJob(cupsd_job_t *job, /* I - Job */
- int force) /* I - 1 = Force all filters to stop */
+cupsdRestartJob(cupsd_job_t *job) /* I - Job */
{
- int i; /* Looping var */
-
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] cupsdStopJob: force = %d",
- job->id, force);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob(job=%p(%d))", job,
+ job->id);
- if (job->state_value != IPP_JOB_PROCESSING)
- return;
-
- FilterLevel -= job->cost;
+ if (job->state_value == IPP_JOB_STOPPED || job->num_files)
+ cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT,
+ "Job restarted by user.");
+}
- if (job->printer->state == IPP_PRINTER_PROCESSING)
- cupsdSetPrinterState(job->printer, IPP_PRINTER_IDLE, 0);
- job->state->values[0].integer = IPP_JOB_STOPPED;
- job->state_value = IPP_JOB_STOPPED;
- job->printer->job = NULL;
- job->printer = NULL;
+/*
+ * 'cupsdSaveAllJobs()' - Save a summary of all jobs to disk.
+ */
- job->current_file --;
+void
+cupsdSaveAllJobs(void)
+{
+ int i; /* Looping var */
+ cups_file_t *fp; /* Job cache file */
+ char temp[1024]; /* Temporary string */
+ cupsd_job_t *job; /* Current job */
+ time_t curtime; /* Current time */
+ struct tm *curdate; /* Current date */
- for (i = 0; job->filters[i]; i ++)
- if (job->filters[i] > 0)
- {
- cupsdEndProcess(job->filters[i], force);
- if (force)
- job->filters[i] = 0;
- }
- if (job->backend > 0)
+ snprintf(temp, sizeof(temp), "%s/job.cache", CacheDir);
+ if ((fp = cupsFileOpen(temp, "w")) == NULL)
{
- cupsdEndProcess(job->backend, force);
- if (force)
- job->backend = 0;
- }
-
- if (!force)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to create job cache file \"%s\" - %s",
+ temp, strerror(errno));
return;
+ }
- cupsdDestroyProfile(job->profile);
- job->profile = NULL;
+ cupsdLogMessage(CUPSD_LOG_INFO, "Saving job cache file \"%s\"...", temp);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing print pipes [ %d %d ]...",
- job->id, job->print_pipes[0], job->print_pipes[1]);
+ /*
+ * Restrict access to the file...
+ */
- cupsdClosePipe(job->print_pipes);
+ fchown(cupsFileNumber(fp), getuid(), Group);
+ fchmod(cupsFileNumber(fp), ConfigFilePerm);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing back pipes [ %d %d ]...",
- job->id, job->back_pipes[0], job->back_pipes[1]);
+ /*
+ * Write a small header to the file...
+ */
- cupsdClosePipe(job->back_pipes);
+ curtime = time(NULL);
+ curdate = localtime(&curtime);
+ strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing side pipes [ %d %d ]...",
- job->id, job->side_pipes[0], job->side_pipes[1]);
+ cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n");
+ cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp);
+ cupsFilePrintf(fp, "NextJobId %d\n", NextJobId);
- cupsdClosePipe(job->side_pipes);
+ /*
+ * Write each job known to the system...
+ */
- if (job->status_buffer)
+ for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(Jobs))
{
- /*
- * Close the pipe and clear the input bit.
- */
-
- cupsdRemoveSelect(job->status_buffer->fd);
-
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "[Job %d] Closing status pipes [ %d %d ]...",
- job->id, job->status_pipes[0], job->status_pipes[1]);
-
- cupsdClosePipe(job->status_pipes);
- cupsdStatBufDelete(job->status_buffer);
-
- job->status_buffer = NULL;
+ cupsFilePrintf(fp, "<Job %d>\n", job->id);
+ cupsFilePrintf(fp, "State %d\n", job->state_value);
+ cupsFilePrintf(fp, "Priority %d\n", job->priority);
+ cupsFilePrintf(fp, "Username %s\n", job->username);
+ cupsFilePrintf(fp, "Destination %s\n", job->dest);
+ cupsFilePrintf(fp, "DestType %d\n", job->dtype);
+ cupsFilePrintf(fp, "NumFiles %d\n", job->num_files);
+ for (i = 0; i < job->num_files; i ++)
+ cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super,
+ job->filetypes[i]->type, job->compressions[i]);
+ cupsFilePuts(fp, "</Job>\n");
}
+
+ cupsFileClose(fp);
}
/*
- * 'cupsdUnloadCompletedJobs()' - Flush completed job history from memory.
+ * 'cupsdSaveJob()' - Save a job to disk.
*/
void
-cupsdUnloadCompletedJobs(void)
+cupsdSaveJob(cupsd_job_t *job) /* I - Job */
{
- cupsd_job_t *job; /* Current job */
- time_t expire; /* Expiration time */
-
-
- expire = time(NULL) - 60;
-
- for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
- job;
- job = (cupsd_job_t *)cupsArrayNext(Jobs))
- if (job->attrs && job->state_value >= IPP_JOB_STOPPED &&
- job->access_time < expire)
- {
- if (job->dirty)
- cupsdSaveJob(job);
+ char filename[1024]; /* Job control filename */
+ cups_file_t *fp; /* Job file */
- unload_job(job);
- }
-}
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p",
+ job, job->id, job->attrs);
-/*
- * 'compare_active_jobs()' - Compare the job IDs and priorities of two jobs.
- */
+ snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, job->id);
-static int /* O - Difference */
-compare_active_jobs(void *first, /* I - First job */
- void *second, /* I - Second job */
- void *data) /* I - App data (not used) */
-{
- int diff; /* Difference */
+ if ((fp = cupsFileOpen(filename, "w")) == NULL)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Unable to create job control file \"%s\" - %s.",
+ job->id, filename, strerror(errno));
+ return;
+ }
+ fchmod(cupsFileNumber(fp), 0600);
+ fchown(cupsFileNumber(fp), RunUser, Group);
- if ((diff = ((cupsd_job_t *)second)->priority -
- ((cupsd_job_t *)first)->priority) != 0)
- return (diff);
- else
- return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id);
-}
+ job->attrs->state = IPP_IDLE;
+ if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL,
+ job->attrs) != IPP_DATA)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Unable to write job control file!", job->id);
-/*
- * 'compare_jobs()' - Compare the job IDs of two jobs.
- */
+ cupsFileClose(fp);
-static int /* O - Difference */
-compare_jobs(void *first, /* I - First job */
- void *second, /* I - Second job */
- void *data) /* I - App data (not used) */
-{
- return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id);
+ job->dirty = 0;
}
/*
- * 'ipp_length()' - Compute the size of the buffer needed to hold
- * the textual IPP attributes.
+ * 'cupsdSetJobHoldUntil()' - Set the hold time for a job.
*/
-static int /* O - Size of attribute buffer */
-ipp_length(ipp_t *ipp) /* I - IPP request */
+void
+cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */
+ const char *when, /* I - When to resume */
+ int update)/* I - Update job-hold-until attr? */
{
- int bytes; /* Number of bytes */
- int i; /* Looping var */
- ipp_attribute_t *attr; /* Current attribute */
-
+ time_t curtime; /* Current time */
+ struct tm *curdate; /* Current date */
+ int hour; /* Hold hour */
+ int minute; /* Hold minute */
+ int second = 0; /* Hold second */
- /*
- * Loop through all attributes...
- */
- bytes = 0;
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdSetJobHoldUntil(job=%p(%d), when=\"%s\", update=%d)",
+ job, job->id, when, update);
- for (attr = ipp->attrs; attr != NULL; attr = attr->next)
+ if (update)
{
/*
- * Skip attributes that won't be sent to filters...
+ * Update the job-hold-until attribute...
*/
- if (attr->value_tag == IPP_TAG_MIMETYPE ||
- attr->value_tag == IPP_TAG_NAMELANG ||
- attr->value_tag == IPP_TAG_TEXTLANG ||
- attr->value_tag == IPP_TAG_URI ||
- attr->value_tag == IPP_TAG_URISCHEME)
- continue;
+ ipp_attribute_t *attr; /* job-hold-until attribute */
- if (strncmp(attr->name, "time-", 5) == 0)
- continue;
+ if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
+ IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
- /*
- * Add space for a leading space and commas between each value.
- * For the first attribute, the leading space isn't used, so the
- * extra byte can be used as the nul terminator...
- */
+ if (attr)
+ cupsdSetString(&(attr->values[0].string.text), when);
+ else
+ attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD,
+ "job-hold-until", NULL, when);
- bytes ++; /* " " separator */
- bytes += attr->num_values; /* "," separators */
+ if (attr)
+ {
+ if (isdigit(when[0] & 255))
+ attr->value_tag = IPP_TAG_NAME;
+ else
+ attr->value_tag = IPP_TAG_KEYWORD;
+
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ }
+ }
+ /*
+ * Update the hold time...
+ */
+
+ if (!strcmp(when, "indefinite") || !strcmp(when, "auth-info-required"))
+ {
/*
- * Boolean attributes appear as "foo,nofoo,foo,nofoo", while
- * other attributes appear as "foo=value1,value2,...,valueN".
+ * Hold indefinitely...
*/
- if (attr->value_tag != IPP_TAG_BOOLEAN)
- bytes += strlen(attr->name);
- else
- bytes += attr->num_values * strlen(attr->name);
-
+ job->hold_until = 0;
+ }
+ else if (!strcmp(when, "day-time"))
+ {
/*
- * Now add the size required for each value in the attribute...
+ * Hold to 6am the next morning unless local time is < 6pm.
*/
- switch (attr->value_tag)
- {
- case IPP_TAG_INTEGER :
- case IPP_TAG_ENUM :
- /*
- * Minimum value of a signed integer is -2147483647, or 11 digits.
- */
+ curtime = time(NULL);
+ curdate = localtime(&curtime);
- bytes += attr->num_values * 11;
- break;
+ if (curdate->tm_hour < 18)
+ job->hold_until = curtime;
+ else
+ job->hold_until = curtime +
+ ((29 - curdate->tm_hour) * 60 + 59 -
+ curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ }
+ else if (!strcmp(when, "evening") || !strcmp(when, "night"))
+ {
+ /*
+ * Hold to 6pm unless local time is > 6pm or < 6am.
+ */
- case IPP_TAG_BOOLEAN :
- /*
- * Add two bytes for each false ("no") value...
- */
+ curtime = time(NULL);
+ curdate = localtime(&curtime);
- for (i = 0; i < attr->num_values; i ++)
- if (!attr->values[i].boolean)
- bytes += 2;
- break;
+ if (curdate->tm_hour < 6 || curdate->tm_hour >= 18)
+ job->hold_until = curtime;
+ else
+ job->hold_until = curtime +
+ ((17 - curdate->tm_hour) * 60 + 59 -
+ curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ }
+ else if (!strcmp(when, "second-shift"))
+ {
+ /*
+ * Hold to 4pm unless local time is > 4pm.
+ */
- case IPP_TAG_RANGE :
- /*
- * A range is two signed integers separated by a hyphen, or
- * 23 characters max.
- */
+ curtime = time(NULL);
+ curdate = localtime(&curtime);
- bytes += attr->num_values * 23;
- break;
+ if (curdate->tm_hour >= 16)
+ job->hold_until = curtime;
+ else
+ job->hold_until = curtime +
+ ((15 - curdate->tm_hour) * 60 + 59 -
+ curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ }
+ else if (!strcmp(when, "third-shift"))
+ {
+ /*
+ * Hold to 12am unless local time is < 8am.
+ */
- case IPP_TAG_RESOLUTION :
- /*
- * A resolution is two signed integers separated by an "x" and
- * suffixed by the units, or 26 characters max.
- */
+ curtime = time(NULL);
+ curdate = localtime(&curtime);
- bytes += attr->num_values * 26;
- break;
+ if (curdate->tm_hour < 8)
+ job->hold_until = curtime;
+ else
+ job->hold_until = curtime +
+ ((23 - curdate->tm_hour) * 60 + 59 -
+ curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ }
+ else if (!strcmp(when, "weekend"))
+ {
+ /*
+ * Hold to weekend unless we are in the weekend.
+ */
- case IPP_TAG_STRING :
- case IPP_TAG_TEXT :
- case IPP_TAG_NAME :
- case IPP_TAG_KEYWORD :
- case IPP_TAG_CHARSET :
- case IPP_TAG_LANGUAGE :
- case IPP_TAG_URI :
- /*
- * Strings can contain characters that need quoting. We need
- * at least 2 * len + 2 characters to cover the quotes and
- * any backslashes in the string.
- */
+ curtime = time(NULL);
+ curdate = localtime(&curtime);
- for (i = 0; i < attr->num_values; i ++)
- bytes += 2 * strlen(attr->values[i].string.text) + 2;
- break;
+ if (curdate->tm_wday == 0 || curdate->tm_wday == 6)
+ job->hold_until = curtime;
+ else
+ job->hold_until = curtime +
+ (((5 - curdate->tm_wday) * 24 +
+ (17 - curdate->tm_hour)) * 60 + 59 -
+ curdate->tm_min) * 60 + 60 - curdate->tm_sec;
+ }
+ else if (sscanf(when, "%d:%d:%d", &hour, &minute, &second) >= 2)
+ {
+ /*
+ * Hold to specified GMT time (HH:MM or HH:MM:SS)...
+ */
- default :
- break; /* anti-compiler-warning-code */
- }
+ curtime = time(NULL);
+ curdate = gmtime(&curtime);
+
+ job->hold_until = curtime +
+ ((hour - curdate->tm_hour) * 60 + minute -
+ curdate->tm_min) * 60 + second - curdate->tm_sec;
+
+ /*
+ * Hold until next day as needed...
+ */
+
+ if (job->hold_until < curtime)
+ job->hold_until += 24 * 60 * 60;
}
- return (bytes);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until=%d",
+ (int)job->hold_until);
}
/*
- * 'load_job_cache()' - Load jobs from the job.cache file.
+ * 'cupsdSetJobPriority()' - Set the priority of a job, moving it up/down in
+ * the list as needed.
*/
-static void
-load_job_cache(const char *filename) /* I - job.cache filename */
+void
+cupsdSetJobPriority(
+ cupsd_job_t *job, /* I - Job ID */
+ int priority) /* I - New priority (0 to 100) */
{
- cups_file_t *fp; /* job.cache file */
- char line[1024], /* Line buffer */
- *value; /* Value on line */
- int linenum; /* Line number in file */
- cupsd_job_t *job; /* Current job */
- int jobid; /* Job ID */
- char jobfile[1024]; /* Job filename */
+ ipp_attribute_t *attr; /* Job attribute */
/*
- * Open the job.cache file...
+ * Don't change completed jobs...
*/
- if ((fp = cupsFileOpen(filename, "r")) == NULL)
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to open job cache file \"%s\": %s",
- filename, strerror(errno));
-
- load_request_root();
-
+ if (job->state_value >= IPP_JOB_PROCESSING)
return;
- }
/*
- * Read entries from the job cache file and create jobs as needed.
+ * Set the new priority and re-add the job into the active list...
*/
- cupsdLogMessage(CUPSD_LOG_INFO, "Loading job cache file \"%s\"...",
- filename);
+ cupsArrayRemove(ActiveJobs, job);
- linenum = 0;
- job = NULL;
+ job->priority = priority;
- while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
- {
- if (!strcasecmp(line, "NextJobId"))
- {
- if (value)
- NextJobId = atoi(value);
- }
- else if (!strcasecmp(line, "<Job"))
- {
- if (job)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing </Job> directive on line %d!",
- linenum);
- continue;
- }
+ if ((attr = ippFindAttribute(job->attrs, "job-priority",
+ IPP_TAG_INTEGER)) != NULL)
+ attr->values[0].integer = priority;
+ else
+ ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority",
+ priority);
- if (!value)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d!", linenum);
- continue;
- }
+ cupsArrayAdd(ActiveJobs, job);
- jobid = atoi(value);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+}
- if (jobid < 1)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d!", jobid,
- linenum);
- continue;
- }
- snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, jobid);
- if (access(jobfile, 0))
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Files have gone away!",
- jobid);
- continue;
- }
+/*
+ * 'cupsdSetJobState()' - Set the state of the specified print job.
+ */
- job = calloc(1, sizeof(cupsd_job_t));
- if (!job)
- {
- cupsdLogMessage(CUPSD_LOG_EMERG,
- "[Job %d] Unable to allocate memory for job!", jobid);
- break;
- }
+void
+cupsdSetJobState(
+ cupsd_job_t *job, /* I - Job to cancel */
+ ipp_jstate_t newstate, /* I - New job state */
+ cupsd_jobaction_t action, /* I - Action to take */
+ const char *message, /* I - Message to log */
+ ...) /* I - Additional arguments as needed */
+{
+ int i; /* Looping var */
+ ipp_jstate_t oldstate; /* Old state */
+ char filename[1024]; /* Job filename */
+ ipp_attribute_t *attr; /* Job attribute */
- job->id = jobid;
- job->back_pipes[0] = -1;
- job->back_pipes[1] = -1;
- job->print_pipes[0] = -1;
- job->print_pipes[1] = -1;
- job->side_pipes[0] = -1;
- job->side_pipes[1] = -1;
- job->status_pipes[0] = -1;
- job->status_pipes[1] = -1;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...",
- job->id);
- }
- else if (!job)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Missing <Job #> directive on line %d!", linenum);
- continue;
- }
- else if (!strcasecmp(line, "</Job>"))
- {
- cupsArrayAdd(Jobs, job);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdSetJobState(job=%p(%d), state=%d, newstate=%d, "
+ "action=%d, message=\"%s\")", job, job->id, job->state_value,
+ newstate, action, message ? message : "(null)");
- if (job->state_value <= IPP_JOB_STOPPED)
- {
- cupsArrayAdd(ActiveJobs, job);
- cupsdLoadJob(job);
- }
- job = NULL;
- }
- else if (!value)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d!", linenum);
- continue;
- }
- else if (!strcasecmp(line, "State"))
- {
- job->state_value = (ipp_jstate_t)atoi(value);
+ /*
+ * Make sure we have the job attributes...
+ */
- if (job->state_value < IPP_JOB_PENDING)
- job->state_value = IPP_JOB_PENDING;
- else if (job->state_value > IPP_JOB_COMPLETED)
- job->state_value = IPP_JOB_COMPLETED;
- }
- else if (!strcasecmp(line, "Priority"))
- {
- job->priority = atoi(value);
- }
- else if (!strcasecmp(line, "Username"))
- {
- cupsdSetString(&job->username, value);
- }
- else if (!strcasecmp(line, "Destination"))
- {
- cupsdSetString(&job->dest, value);
- }
- else if (!strcasecmp(line, "DestType"))
- {
- job->dtype = (cups_ptype_t)atoi(value);
- }
- else if (!strcasecmp(line, "NumFiles"))
- {
- job->num_files = atoi(value);
+ if (!cupsdLoadJob(job))
+ return;
- if (job->num_files < 0)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d!",
- job->num_files, linenum);
- job->num_files = 0;
- continue;
- }
+ /*
+ * Don't do anything if the state is unchanged...
+ */
- if (job->num_files > 0)
- {
- snprintf(jobfile, sizeof(jobfile), "%s/d%05d-001", RequestRoot,
- job->id);
- if (access(jobfile, 0))
- {
- cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away!",
- job->id);
- job->num_files = 0;
- continue;
- }
+ if (newstate == (oldstate = job->state_value))
+ return;
- job->filetypes = calloc(job->num_files, sizeof(mime_type_t *));
- job->compressions = calloc(job->num_files, sizeof(int));
+ /*
+ * Stop any processes that are working on the current job...
+ */
- if (!job->filetypes || !job->compressions)
+ if (oldstate == IPP_JOB_PROCESSING)
+ stop_job(job, action != CUPSD_JOB_DEFAULT);
+
+ /*
+ * Set the new job state...
+ */
+
+ job->state->values[0].integer = newstate;
+ job->state_value = newstate;
+
+ switch (newstate)
+ {
+ case IPP_JOB_PENDING :
+ /*
+ * Update job-hold-until as needed...
+ */
+
+ if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
+ IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
+
+ if (attr)
{
- cupsdLogMessage(CUPSD_LOG_EMERG,
- "[Job %d] Unable to allocate memory for %d files!",
- job->id, job->num_files);
- break;
+ attr->value_tag = IPP_TAG_KEYWORD;
+ cupsdSetString(&(attr->values[0].string.text), "no-hold");
}
- }
- }
- else if (!strcasecmp(line, "File"))
- {
- int number, /* File number */
- compression; /* Compression value */
- char super[MIME_MAX_SUPER], /* MIME super type */
- type[MIME_MAX_TYPE]; /* MIME type */
+ default :
+ break;
- if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type,
- &compression) != 4)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d!", linenum);
- continue;
- }
+ case IPP_JOB_ABORTED :
+ case IPP_JOB_CANCELED :
+ case IPP_JOB_COMPLETED :
+ set_time(job, "time-at-completed");
+ break;
+ }
- if (number < 1 || number > job->num_files)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d!",
- number, linenum);
- continue;
- }
+ /*
+ * Log message as needed...
+ */
- number --;
+ if (message)
+ {
+ char buffer[2048]; /* Message buffer */
+ va_list ap; /* Pointer to additional arguments */
- job->compressions[number] = compression;
- job->filetypes[number] = mimeType(MimeDatabase, super, type);
+ va_start(ap, message);
+ vsnprintf(buffer, sizeof(buffer), message, ap);
+ va_end(ap);
- if (!job->filetypes[number])
- {
+ if (newstate > IPP_JOB_STOPPED)
+ cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, "%s", buffer);
+ else
+ cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer);
+
+ if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED)
+ cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer);
+ else
+ cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer);
+ }
+
+ /*
+ * Handle post-state-change actions...
+ */
+
+ switch (newstate)
+ {
+ case IPP_JOB_PROCESSING :
/*
- * If the original MIME type is unknown, auto-type it!
+ * Add the job to the "printing" list...
*/
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "[Job %d] Unknown MIME type %s/%s for file %d!",
- job->id, super, type, number + 1);
+ if (!cupsArrayFind(PrintingJobs, job))
+ cupsArrayAdd(PrintingJobs, job);
- snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
- job->id, number + 1);
- job->filetypes[number] = mimeFileType(MimeDatabase, jobfile, NULL,
- job->compressions + number);
+ /*
+ * Set the processing time...
+ */
+ set_time(job, "time-at-processing");
+
+ case IPP_JOB_PENDING :
+ case IPP_JOB_HELD :
+ case IPP_JOB_STOPPED :
/*
- * If that didn't work, assume it is raw...
+ * Make sure the job is in the active list...
*/
- if (!job->filetypes[number])
- job->filetypes[number] = mimeType(MimeDatabase, "application",
- "vnd.cups-raw");
- }
- }
- else
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d!",
- line, linenum);
- }
+ if (!cupsArrayFind(ActiveJobs, job))
+ cupsArrayAdd(ActiveJobs, job);
- cupsFileClose(fp);
-}
+ /*
+ * Save the job state to disk...
+ */
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ break;
-/*
- * 'load_next_job_id()' - Load the NextJobId value from the job.cache file.
- */
+ case IPP_JOB_ABORTED :
+ case IPP_JOB_CANCELED :
+ case IPP_JOB_COMPLETED :
+ /*
+ * Expire job subscriptions since the job is now "completed"...
+ */
-static void
-load_next_job_id(const char *filename) /* I - job.cache filename */
-{
- cups_file_t *fp; /* job.cache file */
- char line[1024], /* Line buffer */
- *value; /* Value on line */
- int linenum; /* Line number in file */
- int next_job_id; /* NextJobId value from line */
+ cupsdExpireSubscriptions(NULL, job);
+ /*
+ * Remove the job from the active list...
+ */
- /*
- * Read the NextJobId directive from the job.cache file and use
- * the value (if any).
- */
+ cupsArrayRemove(ActiveJobs, job);
- if ((fp = cupsFileOpen(filename, "r")) == NULL)
- {
- if (errno != ENOENT)
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to open job cache file \"%s\": %s",
- filename, strerror(errno));
+#ifdef __APPLE__
+ /*
+ * If we are going to sleep and the PrintingJobs count is now 0, allow the
+ * sleep to happen immediately...
+ */
- return;
- }
+ if (Sleeping && cupsArrayCount(PrintingJobs) == 0)
+ cupsdAllowSleep();
+#endif /* __APPLE__ */
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Loading NextJobId from job cache file \"%s\"...", filename);
+ /*
+ * Remove any authentication data...
+ */
- linenum = 0;
+ snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id);
+ if (cupsdRemoveFile(filename) && errno != ENOENT)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to remove authentication cache: %s",
+ strerror(errno));
- while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
- {
- if (!strcasecmp(line, "NextJobId"))
- {
- if (value)
- {
- next_job_id = atoi(value);
+ cupsdClearString(&job->auth_username);
+ cupsdClearString(&job->auth_domain);
+ cupsdClearString(&job->auth_password);
- if (next_job_id > NextJobId)
- NextJobId = next_job_id;
- }
- break;
- }
- }
+#ifdef HAVE_GSSAPI
+ /*
+ * Destroy the credential cache and clear the KRB5CCNAME env var string.
+ */
- cupsFileClose(fp);
-}
+ if (job->ccache)
+ {
+ krb5_cc_destroy(KerberosContext, job->ccache);
+ job->ccache = NULL;
+ }
+ cupsdClearString(&job->ccname);
+#endif /* HAVE_GSSAPI */
-/*
- * 'load_request_root()' - Load jobs from the RequestRoot directory.
- */
+ /*
+ * Remove the print file for good if we aren't preserving jobs or
+ * files...
+ */
-static void
-load_request_root(void)
-{
- cups_dir_t *dir; /* Directory */
- cups_dentry_t *dent; /* Directory entry */
- cupsd_job_t *job; /* New job */
+ if (!JobHistory || !JobFiles || action == CUPSD_JOB_PURGE)
+ {
+ for (i = 1; i <= job->num_files; i ++)
+ {
+ snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
+ job->id, i);
+ unlink(filename);
+ }
+ if (job->num_files > 0)
+ {
+ free(job->filetypes);
+ free(job->compressions);
- /*
- * Open the requests directory...
- */
+ job->num_files = 0;
+ job->filetypes = NULL;
+ job->compressions = NULL;
+ }
+ }
- cupsdLogMessage(CUPSD_LOG_DEBUG, "Scanning %s for jobs...", RequestRoot);
+ if (JobHistory && action != CUPSD_JOB_PURGE)
+ {
+ /*
+ * Save job state info...
+ */
- if ((dir = cupsDirOpen(RequestRoot)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR,
- "Unable to open spool directory \"%s\": %s",
- RequestRoot, strerror(errno));
- return;
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ }
+ else if (!job->printer)
+ cupsdDeleteJob(job, CUPSD_JOB_PURGE);
+ break;
}
/*
- * Read all the c##### files...
+ * Update the server "busy" state...
*/
- while ((dent = cupsDirRead(dir)) != NULL)
- if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c')
- {
- /*
- * Allocate memory for the job...
- */
+ cupsdSetBusyState();
+}
- if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL)
- {
- cupsdLogMessage(CUPSD_LOG_ERROR, "Ran out of memory for jobs!");
- cupsDirClose(dir);
- return;
- }
- /*
- * Assign the job ID...
- */
+/*
+ * 'cupsdStopAllJobs()' - Stop all print jobs.
+ */
- job->id = atoi(dent->filename + 1);
- job->back_pipes[0] = -1;
- job->back_pipes[1] = -1;
- job->print_pipes[0] = -1;
- job->print_pipes[1] = -1;
- job->side_pipes[0] = -1;
- job->side_pipes[1] = -1;
- job->status_pipes[0] = -1;
- job->status_pipes[1] = -1;
+void
+cupsdStopAllJobs(
+ cupsd_jobaction_t action) /* I - Action */
+{
+ cupsd_job_t *job; /* Current job */
- if (job->id >= NextJobId)
- NextJobId = job->id + 1;
- /*
- * Load the job...
- */
+ DEBUG_puts("cupsdStopAllJobs()");
- cupsdLoadJob(job);
+ for (job = (cupsd_job_t *)cupsArrayFirst(PrintingJobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(PrintingJobs))
+ cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL);
+}
- /*
- * Insert the job into the array, sorting by job priority and ID...
- */
- cupsArrayAdd(Jobs, job);
+/*
+ * 'cupsdUnloadCompletedJobs()' - Flush completed job history from memory.
+ */
- if (job->state_value <= IPP_JOB_STOPPED)
- cupsArrayAdd(ActiveJobs, job);
- else
- unload_job(job);
- }
+void
+cupsdUnloadCompletedJobs(void)
+{
+ cupsd_job_t *job; /* Current job */
+ time_t expire; /* Expiration time */
- cupsDirClose(dir);
+
+ expire = time(NULL) - 60;
+
+ for (job = (cupsd_job_t *)cupsArrayFirst(Jobs);
+ job;
+ job = (cupsd_job_t *)cupsArrayNext(Jobs))
+ if (job->attrs && job->state_value >= IPP_JOB_STOPPED && !job->printer &&
+ job->access_time < expire)
+ {
+ if (job->dirty)
+ cupsdSaveJob(job);
+
+ unload_job(job);
+ }
}
/*
- * 'set_time()' - Set one of the "time-at-xyz" attributes...
+ * 'compare_active_jobs()' - Compare the job IDs and priorities of two jobs.
*/
-static void
-set_time(cupsd_job_t *job, /* I - Job to update */
- const char *name) /* I - Name of attribute */
+static int /* O - Difference */
+compare_active_jobs(void *first, /* I - First job */
+ void *second, /* I - Second job */
+ void *data) /* I - App data (not used) */
{
- ipp_attribute_t *attr; /* Time attribute */
+ int diff; /* Difference */
- if ((attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO)) != NULL)
- {
- attr->value_tag = IPP_TAG_INTEGER;
- attr->values[0].integer = time(NULL);
- }
+ if ((diff = ((cupsd_job_t *)second)->priority -
+ ((cupsd_job_t *)first)->priority) != 0)
+ return (diff);
+ else
+ return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id);
}
/*
- * 'set_hold_until()' - Set the hold time and update job-hold-until attribute...
+ * 'compare_jobs()' - Compare the job IDs of two jobs.
*/
-static void
-set_hold_until(cupsd_job_t *job, /* I - Job to update */
- time_t holdtime) /* I - Hold until time */
+static int /* O - Difference */
+compare_jobs(void *first, /* I - First job */
+ void *second, /* I - Second job */
+ void *data) /* I - App data (not used) */
{
- ipp_attribute_t *attr; /* job-hold-until attribute */
- struct tm *holddate; /* Hold date */
- char holdstr[64]; /* Hold time */
+ return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id);
+}
- /*
- * Set the hold_until value and hold the job...
- */
+/*
+ * 'finalize_job()' - Cleanup after job filter processes and support data.
+ */
- cupsdLogMessage(CUPSD_LOG_DEBUG, "set_hold_until: hold_until = %d",
- (int)holdtime);
+static void
+finalize_job(cupsd_job_t *job) /* I - Job */
+{
+ ipp_pstate_t printer_state; /* New printer state value */
+ ipp_jstate_t job_state; /* New job state value */
+ const char *message; /* Message for job state */
+ char buffer[1024]; /* Buffer for formatted messages */
- job->state->values[0].integer = IPP_JOB_HELD;
- job->state_value = IPP_JOB_HELD;
- job->hold_until = holdtime;
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id);
/*
- * Update the job-hold-until attribute with a string representing GMT
- * time (HH:MM:SS)...
+ * Clear the "connecting-to-device" reason, which is only valid when a
+ * printer is processing...
*/
- holddate = gmtime(&holdtime);
- snprintf(holdstr, sizeof(holdstr), "%d:%d:%d", holddate->tm_hour,
- holddate->tm_min, holddate->tm_sec);
-
- if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
- IPP_TAG_KEYWORD)) == NULL)
- attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
+ cupsdSetPrinterReasons(job->printer, "-connecting-to-device");
/*
- * Either add the attribute or update the value of the existing one
+ * Similarly, clear the "offline-report" reason for non-USB devices since we
+ * rarely have current information for network devices...
*/
- if (attr == NULL)
- ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-hold-until",
- NULL, holdstr);
- else
- cupsdSetString(&attr->values[0].string.text, holdstr);
-
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
-}
+ if (strncmp(job->printer->device_uri, "usb:", 4))
+ cupsdSetPrinterReasons(job->printer, "-offline-report");
+ /*
+ * Free the security profile...
+ */
-/*
- * 'start_job()' - Start a print job.
- */
+ cupsdDestroyProfile(job->profile);
+ job->profile = NULL;
-static void
-start_job(cupsd_job_t *job, /* I - Job ID */
- cupsd_printer_t *printer) /* I - Printer to print job */
-{
- int i; /* Looping var */
- int slot; /* Pipe slot */
- cups_array_t *filters, /* Filters for job */
- *prefilters; /* Filters with prefilters */
- mime_filter_t *filter, /* Current filter */
- *prefilter, /* Prefilter */
- port_monitor; /* Port monitor filter */
- char method[255], /* Method for output */
- *optptr, /* Pointer to options */
- *valptr; /* Pointer in value string */
- ipp_attribute_t *attr; /* Current attribute */
- struct stat backinfo; /* Backend file information */
- int backroot; /* Run backend as root? */
- int pid; /* Process ID of new filter process */
- int banner_page; /* 1 if banner page, 0 otherwise */
- int filterfds[2][2];/* Pipes used between filters */
- int envc; /* Number of environment variables */
- char **argv, /* Filter command-line arguments */
- filename[1024], /* Job filename */
- command[1024], /* Full path to command */
- jobid[255], /* Job ID string */
- title[IPP_MAX_NAME],
- /* Job title string */
- copies[255], /* # copies string */
- *envp[MAX_ENV + 19],
- /* Environment variables */
- charset[255], /* CHARSET env variable */
- class_name[255],/* CLASS env variable */
- classification[1024],
- /* CLASSIFICATION env variable */
- content_type[1024],
- /* CONTENT_TYPE env variable */
- device_uri[1024],
- /* DEVICE_URI env variable */
- final_content_type[1024],
- /* FINAL_CONTENT_TYPE env variable */
- lang[255], /* LANG env variable */
-#ifdef __APPLE__
- apple_language[255],
- /* APPLE_LANGUAGE env variable */
-#endif /* __APPLE__ */
- ppd[1024], /* PPD env variable */
- printer_info[255],
- /* PRINTER_INFO env variable */
- printer_location[255],
- /* PRINTER_LOCATION env variable */
- printer_name[255],
- /* PRINTER env variable */
- rip_max_cache[255];
- /* RIP_MAX_CACHE env variable */
- static char *options = NULL;/* Full list of options */
- static int optlength = 0; /* Length of option buffer */
+ /*
+ * Close pipes and status buffer...
+ */
+ cupsdRemoveSelect(job->status_buffer->fd);
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: file = %d/%d",
- job->current_file, job->num_files);
+ cupsdClosePipe(job->print_pipes);
+ cupsdClosePipe(job->back_pipes);
+ cupsdClosePipe(job->side_pipes);
+ cupsdClosePipe(job->status_pipes);
- if (job->num_files == 0)
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR, "No files, canceling job!");
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
- return;
- }
+ cupsdStatBufDelete(job->status_buffer);
+ job->status_buffer = NULL;
/*
- * Figure out what filters are required to convert from
- * the source to the destination type...
+ * Process the exit status...
*/
- filters = NULL;
- job->cost = 0;
+ printer_state = IPP_PRINTER_IDLE;
+ job_state = IPP_JOB_COMPLETED;
+ message = "Job completed.";
- if (printer->raw)
+ if (job->status < 0)
{
/*
- * Remote jobs and raw queues go directly to the printer without
- * filtering...
+ * Backend had errors...
*/
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "Sending job to queue tagged as raw...");
+ int exit_code; /* Exit code from backend */
+
- filters = NULL;
- }
- else
- {
/*
- * Local jobs get filtered...
+ * Convert the status to an exit code. Due to the way the W* macros are
+ * implemented on MacOS X (bug?), we have to store the exit status in a
+ * variable first and then convert...
*/
- filters = mimeFilter(MimeDatabase, job->filetypes[job->current_file],
- printer->filetype, &(job->cost));
-
- if (!filters)
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to convert file %d to printable format!",
- job->current_file);
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Hint: Do you have Ghostscript installed?");
-
- if (LogLevel < CUPSD_LOG_DEBUG)
- cupsdLogMessage(CUPSD_LOG_INFO,
- "Hint: Try setting the LogLevel to \"debug\".");
-
- job->current_file ++;
-
- if (job->current_file == job->num_files)
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
+ exit_code = -job->status;
+ if (WIFEXITED(exit_code))
+ exit_code = WEXITSTATUS(exit_code);
+ else
+ exit_code = job->status;
- return;
- }
+ cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)",
+ exit_code,
+ exit_code == CUPS_BACKEND_FAILED ? "failed" :
+ exit_code == CUPS_BACKEND_AUTH_REQUIRED ?
+ "authentication required" :
+ exit_code == CUPS_BACKEND_HOLD ? "hold job" :
+ exit_code == CUPS_BACKEND_STOP ? "stop printer" :
+ exit_code == CUPS_BACKEND_CANCEL ? "cancel job" :
+ exit_code < 0 ? "crashed" : "unknown");
/*
- * Remove NULL ("-") filters...
+ * Do what needs to be done...
*/
- for (filter = (mime_filter_t *)cupsArrayFirst(filters);
- filter;
- filter = (mime_filter_t *)cupsArrayNext(filters))
- if (!strcmp(filter->filter, "-"))
- cupsArrayRemove(filters, filter);
-
- if (cupsArrayCount(filters) == 0)
- {
- cupsArrayDelete(filters);
- filters = NULL;
- }
-
- /*
- * If this printer has any pre-filters, insert the required pre-filter
- * in the filters array...
- */
-
- if (printer->prefiltertype && filters)
+ switch (exit_code)
{
- prefilters = cupsArrayNew(NULL, NULL);
+ default :
+ case CUPS_BACKEND_FAILED :
+ /*
+ * Backend failure, use the error-policy to determine how to
+ * act...
+ */
- for (filter = (mime_filter_t *)cupsArrayFirst(filters);
- filter;
- filter = (mime_filter_t *)cupsArrayNext(filters))
- {
- if ((prefilter = mimeFilterLookup(MimeDatabase, filter->src,
- printer->prefiltertype)))
- {
- cupsArrayAdd(prefilters, prefilter);
- job->cost += prefilter->cost;
- }
+ if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
+ {
+ /*
+ * Queued on a class - mark the job as pending and we'll retry on
+ * another printer...
+ */
- cupsArrayAdd(prefilters, filter);
- }
+ job_state = IPP_JOB_PENDING;
+ message = "Retrying job on another printer.";
+ }
+ else if (!strcmp(job->printer->error_policy, "retry-current-job"))
+ {
+ /*
+ * The error policy is "retry-current-job" - mark the job as pending
+ * and we'll retry on the same printer...
+ */
- cupsArrayDelete(filters);
- filters = prefilters;
- }
- }
+ job_state = IPP_JOB_PENDING;
+ message = "Retrying job on same printer.";
+ }
+ else if ((job->printer->type & CUPS_PRINTER_FAX) ||
+ !strcmp(job->printer->error_policy, "retry-job"))
+ {
+ /*
+ * The job was queued on a fax or the error policy is "retry-job" -
+ * hold the job if the number of retries is less than the
+ * JobRetryLimit, otherwise abort the job.
+ */
- /*
- * Set a minimum cost of 100 for all jobs so that FilterLimit
- * works with raw queues and other low-cost paths.
- */
+ job->tries ++;
- if (job->cost < 100)
- job->cost = 100;
+ if (job->tries >= JobRetryLimit)
+ {
+ /*
+ * Too many tries...
+ */
- /*
- * See if the filter cost is too high...
- */
+ snprintf(buffer, sizeof(buffer),
+ "Job aborted after %d unsuccessful attempts.",
+ JobRetryLimit);
+ job_state = IPP_JOB_ABORTED;
+ message = buffer;
+ }
+ else
+ {
+ /*
+ * Try again in N seconds...
+ */
- if ((FilterLevel + job->cost) > FilterLimit && FilterLevel > 0 &&
- FilterLimit > 0)
- {
- /*
- * Don't print this job quite yet...
- */
+ set_hold_until(job, time(NULL) + JobRetryInterval);
- cupsArrayDelete(filters);
+ snprintf(buffer, sizeof(buffer),
+ "Job held for %d seconds since it could not be sent.",
+ JobRetryInterval);
+ job_state = IPP_JOB_HELD;
+ message = buffer;
+ }
+ }
+ else if (!strcmp(job->printer->error_policy, "abort-job"))
+ {
+ job_state = IPP_JOB_ABORTED;
+ message = "Job aborted due to backend errors; please consult "
+ "the error_log file for details.";
+ }
+ else
+ {
+ printer_state = IPP_PRINTER_STOPPED;
+ job_state = IPP_JOB_PENDING;
+ message = "Printer stopped due to backend errors; please "
+ "consult the error_log file for details.";
+ }
+ break;
- cupsdLogJob(job, CUPSD_LOG_INFO,
- "Holding because filter limit has been reached.");
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: file=%d, cost=%d, level=%d, limit=%d",
- job->current_file, job->cost, FilterLevel,
- FilterLimit);
- return;
- }
+ case CUPS_BACKEND_CANCEL :
+ /*
+ * Abort the job...
+ */
- FilterLevel += job->cost;
+ job_state = IPP_JOB_ABORTED;
+ message = "Job aborted due to backend errors; please consult "
+ "the error_log file for details.";
+ break;
- /*
- * Add decompression/raw filter as needed...
- */
+ case CUPS_BACKEND_HOLD :
+ /*
+ * Hold the job...
+ */
- if ((!printer->raw && job->compressions[job->current_file]) ||
- (!filters && !printer->remote &&
- (job->num_files > 1 || !strncmp(printer->device_uri, "file:", 5))))
- {
- /*
- * Add gziptoany filter to the front of the list...
- */
+ cupsdSetJobHoldUntil(job, "indefinite", 1);
- if (!filters)
- filters = cupsArrayNew(NULL, NULL);
+ job_state = IPP_JOB_HELD;
+ message = "Job held indefinitely due to backend errors; please "
+ "consult the error_log file for details.";
+ break;
- if (!cupsArrayInsert(filters, &gziptoany_filter))
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to add decompression filter - %s", strerror(errno));
+ case CUPS_BACKEND_STOP :
+ /*
+ * Stop the printer...
+ */
- cupsArrayDelete(filters);
+ printer_state = IPP_PRINTER_STOPPED;
+ job_state = IPP_JOB_PENDING;
+ message = "Printer stopped due to backend errors; please "
+ "consult the error_log file for details.";
+ break;
- job->current_file ++;
+ case CUPS_BACKEND_AUTH_REQUIRED :
+ /*
+ * Hold the job for authentication...
+ */
- if (job->current_file == job->num_files)
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
+ cupsdSetJobHoldUntil(job, "auth-info-required", 1);
- return;
+ job_state = IPP_JOB_HELD;
+ message = "Job held for authentication.";
+ break;
}
}
-
- /*
- * Add port monitor, if any...
- */
-
- if (printer->port_monitor)
+ else if (job->status > 0)
{
/*
- * Add port monitor to the end of the list...
+ * Filter had errors; stop job...
*/
- if (!filters)
- filters = cupsArrayNew(NULL, NULL);
-
- port_monitor.src = NULL;
- port_monitor.dst = NULL;
- port_monitor.cost = 0;
-
- snprintf(port_monitor.filter, sizeof(port_monitor.filter),
- "%s/monitor/%s", ServerBin, printer->port_monitor);
-
- if (!cupsArrayAdd(filters, &port_monitor))
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to add port monitor - %s", strerror(errno));
-
- cupsArrayDelete(filters);
-
- job->current_file ++;
-
- if (job->current_file == job->num_files)
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
-
- return;
- }
+ job_state = IPP_JOB_STOPPED;
+ message = "Job stopped due to filter errors; please consult the "
+ "error_log file for details.";
}
/*
- * Make sure we don't go over the "MAX_FILTERS" limit...
+ * Update the printer and job state.
*/
- if (cupsArrayCount(filters) > MAX_FILTERS)
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Too many filters (%d > %d), unable to print!",
- cupsArrayCount(filters), MAX_FILTERS);
-
- cupsArrayDelete(filters);
- cupsdCancelJob(job, 0, IPP_JOB_STOPPED);
+ cupsdSetJobState(job, job_state, CUPSD_JOB_DEFAULT, "%s", message);
+ cupsdSetPrinterState(job->printer, printer_state,
+ printer_state == IPP_PRINTER_STOPPED);
+ update_job_attrs(job, 0);
- return;
- }
+ cupsArrayRemove(PrintingJobs, job);
/*
- * Update the printer and job state to "processing"...
+ * Clear the printer <-> job association...
*/
- job->state->values[0].integer = IPP_JOB_PROCESSING;
- job->state_value = IPP_JOB_PROCESSING;
- job->progress = 0;
- job->status = 0;
- job->printer = printer;
- printer->job = job;
-
- cupsdSetPrinterState(printer, IPP_PRINTER_PROCESSING, 0);
-
- if (job->current_file == 0)
- {
- /*
- * Add to the printing list...
- */
-
- cupsArrayAdd(PrintingJobs, job);
- cupsdSetBusyState();
-
- /*
- * Set the processing time...
- */
-
- set_time(job, "time-at-processing");
-
- /*
- * Create the backchannel pipes and make them non-blocking...
- */
-
- cupsdOpenPipe(job->back_pipes);
-
- fcntl(job->back_pipes[0], F_SETFL,
- fcntl(job->back_pipes[0], F_GETFL) | O_NONBLOCK);
-
- fcntl(job->back_pipes[1], F_SETFL,
- fcntl(job->back_pipes[1], F_GETFL) | O_NONBLOCK);
-
- /*
- * Create the side-channel pipes and make them non-blocking...
- */
-
- socketpair(AF_LOCAL, SOCK_STREAM, 0, job->side_pipes);
-
- fcntl(job->side_pipes[0], F_SETFL,
- fcntl(job->side_pipes[0], F_GETFL) | O_NONBLOCK);
-
- fcntl(job->side_pipes[1], F_SETFL,
- fcntl(job->side_pipes[1], F_GETFL) | O_NONBLOCK);
- }
+ job->printer->job = NULL;
+ job->printer = NULL;
/*
- * Determine if we are printing a banner page or not...
+ * Try printing another job...
*/
- if (job->job_sheets == NULL)
- {
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "No job-sheets attribute.");
- if ((job->job_sheets =
- ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL)
- cupsdLogJob(job, CUPSD_LOG_DEBUG,
- "... but someone added one without setting job_sheets!");
- }
- else if (job->job_sheets->num_values == 1)
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s",
- job->job_sheets->values[0].string.text);
- else
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s,%s",
- job->job_sheets->values[0].string.text,
- job->job_sheets->values[1].string.text);
+ if (printer_state != IPP_PRINTER_STOPPED)
+ cupsdCheckJobs();
+}
- if (printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))
- banner_page = 0;
- else if (job->job_sheets == NULL)
- banner_page = 0;
- else if (strcasecmp(job->job_sheets->values[0].string.text, "none") != 0 &&
- job->current_file == 0)
- banner_page = 1;
- else if (job->job_sheets->num_values > 1 &&
- strcasecmp(job->job_sheets->values[1].string.text, "none") != 0 &&
- job->current_file == (job->num_files - 1))
- banner_page = 1;
- else
- banner_page = 0;
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "banner_page = %d", banner_page);
+/*
+ * 'get_options()' - Get a string containing the job options.
+ */
+
+static char * /* O - Options string */
+get_options(cupsd_job_t *job, /* I - Job */
+ int banner_page, /* I - Printing a banner page? */
+ char *copies, /* I - Copies buffer */
+ size_t copies_size, /* I - Size of copies buffer */
+ char *title, /* I - Title buffer */
+ size_t title_size) /* I - Size of title buffer */
+{
+ int i; /* Looping var */
+ char *optptr, /* Pointer to options */
+ *valptr; /* Pointer in value string */
+ ipp_attribute_t *attr; /* Current attribute */
+ static char *options = NULL;/* Full list of options */
+ static int optlength = 0; /* Length of option buffer */
+
/*
* Building the options string is harder than it needs to be, but
if (i > optlength || !options)
{
- if (optlength == 0)
+ if (!options)
optptr = malloc(i);
else
optptr = realloc(options, i);
- if (optptr == NULL)
+ if (!optptr)
{
cupsdLogJob(job, CUPSD_LOG_CRIT,
"Unable to allocate %d bytes for option buffer!", i);
-
- cupsArrayDelete(filters);
-
- FilterLevel -= job->cost;
-
- cupsdCancelJob(job, 0, IPP_JOB_ABORTED);
- return;
+ return (NULL);
}
options = optptr;
optptr = options;
*optptr = '\0';
- snprintf(title, sizeof(title), "%s-%d", printer->name, job->id);
+ snprintf(title, sizeof(title), "%s-%d", job->printer->name, job->id);
strcpy(copies, "1");
for (attr = job->attrs->attrs; attr != NULL; attr = attr->next)
strcmp(attr->name, "job-impressions") &&
strcmp(attr->name, "job-originating-host-name") &&
strcmp(attr->name, "job-uuid") &&
- !(printer->type & CUPS_PRINTER_REMOTE))
+ !(job->printer->type & CUPS_PRINTER_REMOTE))
continue;
if ((!strcmp(attr->name, "job-impressions") ||
}
}
- /*
- * Build the command-line arguments for the filters. Each filter
- * has 6 or 7 arguments:
- *
- * argv[0] = printer
- * argv[1] = job ID
- * argv[2] = username
- * argv[3] = title
- * argv[4] = # copies
- * argv[5] = options
- * argv[6] = filename (optional; normally stdin)
- *
- * This allows legacy printer drivers that use the old System V
- * printing interface to be used by CUPS.
- *
- * For remote jobs, we send all of the files in the argument list.
+
+ return (options);
+}
+
+
+/*
+ * 'ipp_length()' - Compute the size of the buffer needed to hold
+ * the textual IPP attributes.
+ */
+
+static int /* O - Size of attribute buffer */
+ipp_length(ipp_t *ipp) /* I - IPP request */
+{
+ int bytes; /* Number of bytes */
+ int i; /* Looping var */
+ ipp_attribute_t *attr; /* Current attribute */
+
+
+ /*
+ * Loop through all attributes...
*/
- if (printer->remote && job->num_files > 1)
- argv = calloc(7 + job->num_files, sizeof(char *));
- else
- argv = calloc(8, sizeof(char *));
+ bytes = 0;
- if (!argv)
+ for (attr = ipp->attrs; attr != NULL; attr = attr->next)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to allocate argument array!");
- cupsArrayDelete(filters);
+ /*
+ * Skip attributes that won't be sent to filters...
+ */
- FilterLevel -= job->cost;
+ if (attr->value_tag == IPP_TAG_MIMETYPE ||
+ attr->value_tag == IPP_TAG_NAMELANG ||
+ attr->value_tag == IPP_TAG_TEXTLANG ||
+ attr->value_tag == IPP_TAG_URI ||
+ attr->value_tag == IPP_TAG_URISCHEME)
+ continue;
- cupsdStopPrinter(printer, 0);
- return;
- }
+ if (strncmp(attr->name, "time-", 5) == 0)
+ continue;
- sprintf(jobid, "%d", job->id);
+ /*
+ * Add space for a leading space and commas between each value.
+ * For the first attribute, the leading space isn't used, so the
+ * extra byte can be used as the nul terminator...
+ */
- argv[0] = printer->name;
- argv[1] = jobid;
- argv[2] = job->username;
- argv[3] = title;
- argv[4] = copies;
- argv[5] = options;
+ bytes ++; /* " " separator */
+ bytes += attr->num_values; /* "," separators */
- if (printer->remote && job->num_files > 1)
- {
- for (i = 0; i < job->num_files; i ++)
+ /*
+ * Boolean attributes appear as "foo,nofoo,foo,nofoo", while
+ * other attributes appear as "foo=value1,value2,...,valueN".
+ */
+
+ if (attr->value_tag != IPP_TAG_BOOLEAN)
+ bytes += strlen(attr->name);
+ else
+ bytes += attr->num_values * strlen(attr->name);
+
+ /*
+ * Now add the size required for each value in the attribute...
+ */
+
+ switch (attr->value_tag)
{
- snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
- job->id, i + 1);
- argv[6 + i] = strdup(filename);
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
+ /*
+ * Minimum value of a signed integer is -2147483647, or 11 digits.
+ */
+
+ bytes += attr->num_values * 11;
+ break;
+
+ case IPP_TAG_BOOLEAN :
+ /*
+ * Add two bytes for each false ("no") value...
+ */
+
+ for (i = 0; i < attr->num_values; i ++)
+ if (!attr->values[i].boolean)
+ bytes += 2;
+ break;
+
+ case IPP_TAG_RANGE :
+ /*
+ * A range is two signed integers separated by a hyphen, or
+ * 23 characters max.
+ */
+
+ bytes += attr->num_values * 23;
+ break;
+
+ case IPP_TAG_RESOLUTION :
+ /*
+ * A resolution is two signed integers separated by an "x" and
+ * suffixed by the units, or 26 characters max.
+ */
+
+ bytes += attr->num_values * 26;
+ break;
+
+ case IPP_TAG_STRING :
+ case IPP_TAG_TEXT :
+ case IPP_TAG_NAME :
+ case IPP_TAG_KEYWORD :
+ case IPP_TAG_CHARSET :
+ case IPP_TAG_LANGUAGE :
+ case IPP_TAG_URI :
+ /*
+ * Strings can contain characters that need quoting. We need
+ * at least 2 * len + 2 characters to cover the quotes and
+ * any backslashes in the string.
+ */
+
+ for (i = 0; i < attr->num_values; i ++)
+ bytes += 2 * strlen(attr->values[i].string.text) + 2;
+ break;
+
+ default :
+ break; /* anti-compiler-warning-code */
}
}
- else
+
+ return (bytes);
+}
+
+
+/*
+ * 'load_job_cache()' - Load jobs from the job.cache file.
+ */
+
+static void
+load_job_cache(const char *filename) /* I - job.cache filename */
+{
+ cups_file_t *fp; /* job.cache file */
+ char line[1024], /* Line buffer */
+ *value; /* Value on line */
+ int linenum; /* Line number in file */
+ cupsd_job_t *job; /* Current job */
+ int jobid; /* Job ID */
+ char jobfile[1024]; /* Job filename */
+
+
+ /*
+ * Open the job.cache file...
+ */
+
+ if ((fp = cupsFileOpen(filename, "r")) == NULL)
{
- snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot,
- job->id, job->current_file + 1);
- argv[6] = filename;
- }
+ if (errno != ENOENT)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to open job cache file \"%s\": %s",
+ filename, strerror(errno));
- for (i = 0; argv[i]; i ++)
- cupsdLogJob(job, CUPSD_LOG_DEBUG,
- "argv[%d]=\"%s\"", i, argv[i]);
+ load_request_root();
+
+ return;
+ }
/*
- * Create environment variable strings for the filters...
+ * Read entries from the job cache file and create jobs as needed.
*/
- attr = ippFindAttribute(job->attrs, "attributes-natural-language",
- IPP_TAG_LANGUAGE);
+ cupsdLogMessage(CUPSD_LOG_INFO, "Loading job cache file \"%s\"...",
+ filename);
-#ifdef __APPLE__
- strcpy(apple_language, "APPLE_LANGUAGE=");
- _cupsAppleLanguage(attr->values[0].string.text,
- apple_language + 15, sizeof(apple_language) - 15);
-#endif /* __APPLE__ */
+ linenum = 0;
+ job = NULL;
+
+ while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
+ {
+ if (!strcasecmp(line, "NextJobId"))
+ {
+ if (value)
+ NextJobId = atoi(value);
+ }
+ else if (!strcasecmp(line, "<Job"))
+ {
+ if (job)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing </Job> directive on line %d!",
+ linenum);
+ continue;
+ }
+
+ if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d!", linenum);
+ continue;
+ }
+
+ jobid = atoi(value);
+
+ if (jobid < 1)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d!", jobid,
+ linenum);
+ continue;
+ }
+
+ snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, jobid);
+ if (access(jobfile, 0))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Files have gone away!",
+ jobid);
+ continue;
+ }
+
+ job = calloc(1, sizeof(cupsd_job_t));
+ if (!job)
+ {
+ cupsdLogMessage(CUPSD_LOG_EMERG,
+ "[Job %d] Unable to allocate memory for job!", jobid);
+ break;
+ }
+
+ job->id = jobid;
+ job->back_pipes[0] = -1;
+ job->back_pipes[1] = -1;
+ job->print_pipes[0] = -1;
+ job->print_pipes[1] = -1;
+ job->side_pipes[0] = -1;
+ job->side_pipes[1] = -1;
+ job->status_pipes[0] = -1;
+ job->status_pipes[1] = -1;
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...",
+ job->id);
+ }
+ else if (!job)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Missing <Job #> directive on line %d!", linenum);
+ continue;
+ }
+ else if (!strcasecmp(line, "</Job>"))
+ {
+ cupsArrayAdd(Jobs, job);
+
+ if (job->state_value <= IPP_JOB_STOPPED)
+ {
+ cupsArrayAdd(ActiveJobs, job);
+ cupsdLoadJob(job);
+ }
+
+ job = NULL;
+ }
+ else if (!value)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d!", linenum);
+ continue;
+ }
+ else if (!strcasecmp(line, "State"))
+ {
+ job->state_value = (ipp_jstate_t)atoi(value);
+
+ if (job->state_value < IPP_JOB_PENDING)
+ job->state_value = IPP_JOB_PENDING;
+ else if (job->state_value > IPP_JOB_COMPLETED)
+ job->state_value = IPP_JOB_COMPLETED;
+ }
+ else if (!strcasecmp(line, "Priority"))
+ {
+ job->priority = atoi(value);
+ }
+ else if (!strcasecmp(line, "Username"))
+ {
+ cupsdSetString(&job->username, value);
+ }
+ else if (!strcasecmp(line, "Destination"))
+ {
+ cupsdSetString(&job->dest, value);
+ }
+ else if (!strcasecmp(line, "DestType"))
+ {
+ job->dtype = (cups_ptype_t)atoi(value);
+ }
+ else if (!strcasecmp(line, "NumFiles"))
+ {
+ job->num_files = atoi(value);
+
+ if (job->num_files < 0)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d!",
+ job->num_files, linenum);
+ job->num_files = 0;
+ continue;
+ }
+
+ if (job->num_files > 0)
+ {
+ snprintf(jobfile, sizeof(jobfile), "%s/d%05d-001", RequestRoot,
+ job->id);
+ if (access(jobfile, 0))
+ {
+ cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away!",
+ job->id);
+ job->num_files = 0;
+ continue;
+ }
+
+ job->filetypes = calloc(job->num_files, sizeof(mime_type_t *));
+ job->compressions = calloc(job->num_files, sizeof(int));
+
+ if (!job->filetypes || !job->compressions)
+ {
+ cupsdLogMessage(CUPSD_LOG_EMERG,
+ "[Job %d] Unable to allocate memory for %d files!",
+ job->id, job->num_files);
+ break;
+ }
+ }
+ }
+ else if (!strcasecmp(line, "File"))
+ {
+ int number, /* File number */
+ compression; /* Compression value */
+ char super[MIME_MAX_SUPER], /* MIME super type */
+ type[MIME_MAX_TYPE]; /* MIME type */
+
+
+ if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type,
+ &compression) != 4)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d!", linenum);
+ continue;
+ }
+
+ if (number < 1 || number > job->num_files)
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d!",
+ number, linenum);
+ continue;
+ }
- switch (strlen(attr->values[0].string.text))
- {
- default :
- /*
- * This is an unknown or badly formatted language code; use
- * the POSIX locale...
- */
+ number --;
- strcpy(lang, "LANG=C");
- break;
+ job->compressions[number] = compression;
+ job->filetypes[number] = mimeType(MimeDatabase, super, type);
- case 2 :
+ if (!job->filetypes[number])
+ {
/*
- * Just the language code (ll)...
+ * If the original MIME type is unknown, auto-type it!
*/
- snprintf(lang, sizeof(lang), "LANG=%s.UTF8",
- attr->values[0].string.text);
- break;
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "[Job %d] Unknown MIME type %s/%s for file %d!",
+ job->id, super, type, number + 1);
+
+ snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot,
+ job->id, number + 1);
+ job->filetypes[number] = mimeFileType(MimeDatabase, jobfile, NULL,
+ job->compressions + number);
- case 5 :
/*
- * Language and country code (ll-cc)...
+ * If that didn't work, assume it is raw...
*/
- snprintf(lang, sizeof(lang), "LANG=%c%c_%c%c.UTF8",
- attr->values[0].string.text[0],
- attr->values[0].string.text[1],
- toupper(attr->values[0].string.text[3] & 255),
- toupper(attr->values[0].string.text[4] & 255));
- break;
- }
-
- attr = ippFindAttribute(job->attrs, "document-format",
- IPP_TAG_MIMETYPE);
- if (attr != NULL &&
- (optptr = strstr(attr->values[0].string.text, "charset=")) != NULL)
- snprintf(charset, sizeof(charset), "CHARSET=%s", optptr + 8);
- else
- {
- attr = ippFindAttribute(job->attrs, "attributes-charset",
- IPP_TAG_CHARSET);
- snprintf(charset, sizeof(charset), "CHARSET=%s",
- attr->values[0].string.text);
+ if (!job->filetypes[number])
+ job->filetypes[number] = mimeType(MimeDatabase, "application",
+ "vnd.cups-raw");
+ }
+ }
+ else
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d!",
+ line, linenum);
}
- snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s",
- job->filetypes[job->current_file]->super,
- job->filetypes[job->current_file]->type);
- snprintf(device_uri, sizeof(device_uri), "DEVICE_URI=%s",
- printer->device_uri);
- snprintf(ppd, sizeof(ppd), "PPD=%s/ppd/%s.ppd", ServerRoot, printer->name);
- snprintf(printer_info, sizeof(printer_name), "PRINTER_INFO=%s",
- printer->info ? printer->info : "");
- snprintf(printer_location, sizeof(printer_name), "PRINTER_LOCATION=%s",
- printer->location ? printer->location : "");
- snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", printer->name);
- snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache);
+ cupsFileClose(fp);
+}
- envc = cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0])));
- envp[envc ++] = charset;
- envp[envc ++] = lang;
-#ifdef __APPLE__
- envp[envc ++] = apple_language;
-#endif /* __APPLE__ */
- envp[envc ++] = ppd;
- envp[envc ++] = rip_max_cache;
- envp[envc ++] = content_type;
- envp[envc ++] = device_uri;
- envp[envc ++] = printer_info;
- envp[envc ++] = printer_location;
- envp[envc ++] = printer_name;
- envp[envc ++] = banner_page ? "CUPS_FILETYPE=job-sheet" :
- "CUPS_FILETYPE=document";
+/*
+ * 'load_next_job_id()' - Load the NextJobId value from the job.cache file.
+ */
- if (!printer->remote && !printer->raw)
- {
- filter = (mime_filter_t *)cupsArrayLast(filters);
+static void
+load_next_job_id(const char *filename) /* I - job.cache filename */
+{
+ cups_file_t *fp; /* job.cache file */
+ char line[1024], /* Line buffer */
+ *value; /* Value on line */
+ int linenum; /* Line number in file */
+ int next_job_id; /* NextJobId value from line */
- if (printer->port_monitor)
- filter = (mime_filter_t *)cupsArrayPrev(filters);
- if (filter && filter->dst)
- {
- snprintf(final_content_type, sizeof(final_content_type),
- "FINAL_CONTENT_TYPE=%s/%s",
- filter->dst->super, filter->dst->type);
- envp[envc ++] = final_content_type;
- }
- }
+ /*
+ * Read the NextJobId directive from the job.cache file and use
+ * the value (if any).
+ */
- if (Classification && !banner_page)
+ if ((fp = cupsFileOpen(filename, "r")) == NULL)
{
- if ((attr = ippFindAttribute(job->attrs, "job-sheets",
- IPP_TAG_NAME)) == NULL)
- snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
- Classification);
- else if (attr->num_values > 1 &&
- strcmp(attr->values[1].string.text, "none") != 0)
- snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
- attr->values[1].string.text);
- else
- snprintf(classification, sizeof(classification), "CLASSIFICATION=%s",
- attr->values[0].string.text);
+ if (errno != ENOENT)
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to open job cache file \"%s\": %s",
+ filename, strerror(errno));
- envp[envc ++] = classification;
+ return;
}
- if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))
+ cupsdLogMessage(CUPSD_LOG_INFO,
+ "Loading NextJobId from job cache file \"%s\"...", filename);
+
+ linenum = 0;
+
+ while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
{
- snprintf(class_name, sizeof(class_name), "CLASS=%s", job->dest);
- envp[envc ++] = class_name;
+ if (!strcasecmp(line, "NextJobId"))
+ {
+ if (value)
+ {
+ next_job_id = atoi(value);
+
+ if (next_job_id > NextJobId)
+ NextJobId = next_job_id;
+ }
+ break;
+ }
}
- if (job->auth_username)
- envp[envc ++] = job->auth_username;
- if (job->auth_domain)
- envp[envc ++] = job->auth_domain;
- if (job->auth_password)
- envp[envc ++] = job->auth_password;
+ cupsFileClose(fp);
+}
-#ifdef HAVE_GSSAPI
- if (job->ccname)
- envp[envc ++] = job->ccname;
-#endif /* HAVE_GSSAPI */
- envp[envc] = NULL;
+/*
+ * 'load_request_root()' - Load jobs from the RequestRoot directory.
+ */
- for (i = 0; i < envc; i ++)
- if (!strncmp(envp[i], "AUTH_", 5))
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"AUTH_%c****\"", i,
- envp[i][5]);
- else if (strncmp(envp[i], "DEVICE_URI=", 11))
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"%s\"", i, envp[i]);
- else
- cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"DEVICE_URI=%s\"", i,
- printer->sanitized_device_uri);
+static void
+load_request_root(void)
+{
+ cups_dir_t *dir; /* Directory */
+ cups_dentry_t *dent; /* Directory entry */
+ cupsd_job_t *job; /* New job */
- if (printer->remote)
- job->current_file = job->num_files;
- else
- job->current_file ++;
/*
- * Now create processes for all of the filters...
+ * Open the requests directory...
*/
- filterfds[0][0] = -1;
- filterfds[0][1] = -1;
- filterfds[1][0] = -1;
- filterfds[1][1] = -1;
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Scanning %s for jobs...", RequestRoot);
- if (!job->status_buffer)
+ if ((dir = cupsDirOpen(RequestRoot)) == NULL)
{
- if (cupsdOpenPipe(job->status_pipes))
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to create job status pipes - %s.", strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to create status pipes - %s.", strerror(errno));
-
- cupsdAddPrinterHistory(printer);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not create the job "
- "status pipes.");
-
- goto abort_job;
- }
-
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: status_pipes = [ %d %d ]",
- job->status_pipes[0], job->status_pipes[1]);
-
- job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL);
- job->status_level = CUPSD_LOG_INFO;
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Unable to open spool directory \"%s\": %s",
+ RequestRoot, strerror(errno));
+ return;
}
- job->status = 0;
- memset(job->filters, 0, sizeof(job->filters));
-
- if (!job->profile)
- job->profile = cupsdCreateProfile(job->id);
-
- for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters);
- filter;
- i ++, filter = (mime_filter_t *)cupsArrayNext(filters))
- {
- if (filter->filter[0] != '/')
- snprintf(command, sizeof(command), "%s/filter/%s", ServerBin,
- filter->filter);
- else
- strlcpy(command, filter->filter, sizeof(command));
+ /*
+ * Read all the c##### files...
+ */
- if (i < (cupsArrayCount(filters) - 1))
+ while ((dent = cupsDirRead(dir)) != NULL)
+ if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c')
{
- if (cupsdOpenPipe(filterfds[slot]))
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to create job filter pipes - %s.", strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to create filter pipes - %s.", strerror(errno));
- cupsdAddPrinterHistory(printer);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not create the "
- "filter pipes.");
+ /*
+ * Allocate memory for the job...
+ */
- goto abort_job;
- }
- }
- else
- {
- if (job->current_file == 1)
+ if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL)
{
- if (strncmp(printer->device_uri, "file:", 5) != 0)
- {
- if (cupsdOpenPipe(job->print_pipes))
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to create job backend pipes - %s.",
- strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to create backend pipes - %s.", strerror(errno));
- cupsdAddPrinterHistory(printer);
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Ran out of memory for jobs!");
+ cupsDirClose(dir);
+ return;
+ }
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not create "
- "the backend pipes.");
+ /*
+ * Assign the job ID...
+ */
- goto abort_job;
- }
- }
- else
- {
- job->print_pipes[0] = -1;
- if (!strcmp(printer->device_uri, "file:/dev/null") ||
- !strcmp(printer->device_uri, "file:///dev/null"))
- job->print_pipes[1] = -1;
- else
- {
- if (!strncmp(printer->device_uri, "file:/dev/", 10))
- job->print_pipes[1] = open(printer->device_uri + 5,
- O_WRONLY | O_EXCL);
- else if (!strncmp(printer->device_uri, "file:///dev/", 12))
- job->print_pipes[1] = open(printer->device_uri + 7,
- O_WRONLY | O_EXCL);
- else if (!strncmp(printer->device_uri, "file:///", 8))
- job->print_pipes[1] = open(printer->device_uri + 7,
- O_WRONLY | O_CREAT | O_TRUNC, 0600);
- else
- job->print_pipes[1] = open(printer->device_uri + 5,
- O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ job->id = atoi(dent->filename + 1);
+ job->back_pipes[0] = -1;
+ job->back_pipes[1] = -1;
+ job->print_pipes[0] = -1;
+ job->print_pipes[1] = -1;
+ job->side_pipes[0] = -1;
+ job->side_pipes[1] = -1;
+ job->status_pipes[0] = -1;
+ job->status_pipes[1] = -1;
- if (job->print_pipes[1] < 0)
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR,
- "Unable to open output file \"%s\" - %s.",
- printer->device_uri, strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to open output file \"%s\" - %s.",
- printer->device_uri, strerror(errno));
+ if (job->id >= NextJobId)
+ NextJobId = job->id + 1;
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not open the "
- "output file.");
+ /*
+ * Load the job...
+ */
- goto abort_job;
- }
+ cupsdLoadJob(job);
- fcntl(job->print_pipes[1], F_SETFD,
- fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC);
- }
- }
+ /*
+ * Insert the job into the array, sorting by job priority and ID...
+ */
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: print_pipes = [ %d %d ]",
- job->print_pipes[0], job->print_pipes[1]);
- }
+ cupsArrayAdd(Jobs, job);
- filterfds[slot][0] = job->print_pipes[0];
- filterfds[slot][1] = job->print_pipes[1];
+ if (job->state_value <= IPP_JOB_STOPPED)
+ cupsArrayAdd(ActiveJobs, job);
+ else
+ unload_job(job);
}
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filter=\"%s\"", command);
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filterfds[%d]=[ %d %d ]",
- slot, filterfds[slot][0], filterfds[slot][1]);
+ cupsDirClose(dir);
+}
- 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->filters + i);
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing filter pipes for slot %d [ %d %d ]...",
- !slot, filterfds[!slot][0], filterfds[!slot][1]);
+/*
+ * 'set_hold_until()' - Set the hold time and update job-hold-until attribute.
+ */
- cupsdClosePipe(filterfds[!slot]);
+static void
+set_hold_until(cupsd_job_t *job, /* I - Job to update */
+ time_t holdtime) /* I - Hold until time */
+{
+ ipp_attribute_t *attr; /* job-hold-until attribute */
+ struct tm *holddate; /* Hold date */
+ char holdstr[64]; /* Hold time */
- if (pid == 0)
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.",
- filter->filter, strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to start filter \"%s\" - %s.",
- filter->filter, strerror(errno));
- cupsdAddPrinterHistory(printer);
+ /*
+ * Set the hold_until value and hold the job...
+ */
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not execute a "
- "filter.");
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "set_hold_until: hold_until = %d",
+ (int)holdtime);
- goto abort_job;
- }
+ job->state->values[0].integer = IPP_JOB_HELD;
+ job->state_value = IPP_JOB_HELD;
+ job->hold_until = holdtime;
- cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command,
- pid);
+ /*
+ * Update the job-hold-until attribute with a string representing GMT
+ * time (HH:MM:SS)...
+ */
- argv[6] = NULL;
- slot = !slot;
- }
+ holddate = gmtime(&holdtime);
+ snprintf(holdstr, sizeof(holdstr), "%d:%d:%d", holddate->tm_hour,
+ holddate->tm_min, holddate->tm_sec);
- cupsArrayDelete(filters);
- filters = NULL;
+ if ((attr = ippFindAttribute(job->attrs, "job-hold-until",
+ IPP_TAG_KEYWORD)) == NULL)
+ attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME);
/*
- * Finally, pipe the final output into a backend process if needed...
+ * Either add the attribute or update the value of the existing one
*/
- if (strncmp(printer->device_uri, "file:", 5) != 0)
- {
- if (job->current_file == 1 || printer->remote)
- {
- sscanf(printer->device_uri, "%254[^:]", method);
- snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, method);
+ if (attr == NULL)
+ ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-hold-until",
+ NULL, holdstr);
+ else
+ cupsdSetString(&attr->values[0].string.text, holdstr);
- /*
- * See if the backend needs to run as root...
- */
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+}
- if (RunUser)
- backroot = 0;
- else if (stat(command, &backinfo))
- backroot = 0;
- else
- backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO));
- argv[0] = printer->sanitized_device_uri;
+/*
+ * 'set_time()' - Set one of the "time-at-xyz" attributes.
+ */
- filterfds[slot][0] = -1;
- filterfds[slot][1] = -1;
+static void
+set_time(cupsd_job_t *job, /* I - Job to update */
+ const char *name) /* I - Name of attribute */
+{
+ ipp_attribute_t *attr; /* Time attribute */
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: backend=\"%s\"", command);
- cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filterfds[%d] = [ %d %d ]",
- slot, filterfds[slot][0], filterfds[slot][1]);
- 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->backend));
+ if ((attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO)) != NULL)
+ {
+ attr->value_tag = IPP_TAG_INTEGER;
+ attr->values[0].integer = time(NULL);
+ }
+}
- if (pid == 0)
- {
- cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start backend \"%s\" - %s.",
- method, strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to start backend \"%s\" - %s.", method,
- strerror(errno));
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not execute "
- "the backend.");
+/*
+ * 'start_job()' - Start a print job.
+ */
- goto abort_job;
- }
- else
- {
- cupsdLogJob(job, CUPSD_LOG_INFO, "Started backend %s (PID %d)",
- command, pid);
- }
- }
+static void
+start_job(cupsd_job_t *job, /* I - Job ID */
+ cupsd_printer_t *printer) /* I - Printer to print job */
+{
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))",
+ job, job->id, printer, printer->name);
- if (job->current_file == job->num_files)
- {
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing print pipes [ %d %d ]...",
- job->print_pipes[0], job->print_pipes[1]);
+ /*
+ * Make sure we have some files around before we try to print...
+ */
- cupsdClosePipe(job->print_pipes);
+ if (job->num_files == 0)
+ {
+ cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_DEFAULT,
+ "Aborting job because it has no files.");
+ return;
+ }
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing back pipes [ %d %d ]...",
- job->back_pipes[0], job->back_pipes[1]);
+ /*
+ * Update the printer and job state to "processing"...
+ */
- cupsdClosePipe(job->back_pipes);
+ if (!cupsdLoadJob(job))
+ return;
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing side pipes [ %d %d ]...",
- job->side_pipes[0], job->side_pipes[1]);
+ cupsdSetJobState(job, IPP_JOB_PROCESSING, CUPSD_JOB_DEFAULT, NULL);
+ cupsdSetPrinterState(printer, IPP_PRINTER_PROCESSING, 0);
- cupsdClosePipe(job->side_pipes);
+ job->cost = 0;
+ job->progress = 0;
+ job->printer = printer;
+ printer->job = job;
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing status output pipe %d...",
- job->status_pipes[1]);
+ /*
+ * Setup the last exit status and security profiles...
+ */
- close(job->status_pipes[1]);
- job->status_pipes[1] = -1;
- }
- }
- else
- {
- filterfds[slot][0] = -1;
- filterfds[slot][1] = -1;
+ job->status = 0;
+ job->profile = cupsdCreateProfile(job->id);
- if (job->current_file == job->num_files)
- {
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing print pipes [ %d %d ]...",
- job->print_pipes[0], job->print_pipes[1]);
+ /*
+ * Create the status pipes and buffer...
+ */
- cupsdClosePipe(job->print_pipes);
+ if (cupsdOpenPipe(job->status_pipes))
+ {
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Unable to create job status pipes - %s.", strerror(errno));
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing status output pipe %d...",
- job->status_pipes[1]);
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Job stopped because the scheduler could not create the "
+ "job status pipes.");
- close(job->status_pipes[1]);
- job->status_pipes[1] = -1;
- }
+ cupsdDestroyProfile(job->profile);
+ job->profile = NULL;
+ return;
}
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing filter pipes for slot %d [ %d %d ]...",
- slot, filterfds[slot][0], filterfds[slot][1]);
- cupsdClosePipe(filterfds[slot]);
+ job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL);
+ job->status_level = CUPSD_LOG_INFO;
+
+ /*
+ * Create the backchannel pipes and make them non-blocking...
+ */
- if (printer->remote && job->num_files > 1)
+ if (cupsdOpenPipe(job->back_pipes))
{
- for (i = 0; i < job->num_files; i ++)
- free(argv[i + 6]);
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Unable to create back-channel pipes - %s.", strerror(errno));
+
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Job stopped because the scheduler could not create the "
+ "back-channel pipes.");
+
+ cupsdClosePipe(job->status_pipes);
+ cupsdStatBufDelete(job->status_buffer);
+ job->status_buffer = NULL;
+
+ cupsdDestroyProfile(job->profile);
+ job->profile = NULL;
+ return;
}
- free(argv);
+ fcntl(job->back_pipes[0], F_SETFL,
+ fcntl(job->back_pipes[0], F_GETFL) | O_NONBLOCK);
+ fcntl(job->back_pipes[1], F_SETFL,
+ fcntl(job->back_pipes[1], F_GETFL) | O_NONBLOCK);
- cupsdAddSelect(job->status_buffer->fd, (cupsd_selfunc_t)update_job, NULL,
- job);
+ /*
+ * Create the side-channel pipes and make them non-blocking...
+ */
- cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.",
- job->id);
+ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, job->side_pipes))
+ {
+ cupsdLogJob(job, CUPSD_LOG_DEBUG,
+ "Unable to create side-channel pipes - %s.", strerror(errno));
- return;
+ cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT,
+ "Job stopped because the scheduler could not create the "
+ "side-channel pipes.");
+ cupsdClosePipe(job->back_pipes);
+
+ cupsdClosePipe(job->status_pipes);
+ cupsdStatBufDelete(job->status_buffer);
+ job->status_buffer = NULL;
+
+ cupsdDestroyProfile(job->profile);
+ job->profile = NULL;
+ return;
+ }
+
+ fcntl(job->side_pipes[0], F_SETFL,
+ fcntl(job->side_pipes[0], F_GETFL) | O_NONBLOCK);
+ fcntl(job->side_pipes[1], F_SETFL,
+ fcntl(job->side_pipes[1], F_GETFL) | O_NONBLOCK);
/*
- * If we get here, we need to abort the current job and close out all
- * files and pipes...
+ * Now start the first file in the job...
*/
- abort_job:
+ cupsdContinueJob(job);
+}
- for (slot = 0; slot < 2; slot ++)
- {
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing filter pipes for slot %d [ %d %d ]...",
- slot, filterfds[slot][0], filterfds[slot][1]);
- cupsdClosePipe(filterfds[slot]);
- }
- cupsdLogJob(job, CUPSD_LOG_DEBUG2,
- "start_job: Closing status pipes [ %d %d ]...",
- job->status_pipes[0], job->status_pipes[1]);
- cupsdClosePipe(job->status_pipes);
- cupsdStatBufDelete(job->status_buffer);
+/*
+ * 'stop_job()' - Stop a print job.
+ */
- job->status_buffer = NULL;
+static void
+stop_job(cupsd_job_t *job, /* I - Job */
+ cupsd_jobaction_t action) /* I - Action */
+{
+ int i; /* Looping var */
- cupsArrayDelete(filters);
- if (printer->remote && job->num_files > 1)
- {
- for (i = 0; i < job->num_files; i ++)
- free(argv[i + 6]);
- }
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_job(job=%p(%d), action=%d)", job,
+ job->id, action);
- free(argv);
+ FilterLevel -= job->cost;
+ job->cost = 0;
- cupsdStopJob(job, 0);
+ for (i = 0; job->filters[i]; i ++)
+ if (job->filters[i] > 0)
+ cupsdEndProcess(job->filters[i], action == CUPSD_JOB_FORCE);
+
+ if (job->backend > 0)
+ cupsdEndProcess(job->backend, action == CUPSD_JOB_FORCE);
}
*ptr; /* Pointer update... */
int loglevel, /* Log level for message */
event = 0; /* Events? */
- cupsd_printer_t *printer; /* Printer for job */
static const char * const levels[] = /* Log levels */
{
"NONE",
* a valid pointer...
*/
- if ((printer = job->printer) == NULL)
- printer = cupsdFindDest(job->dest);
-
while ((ptr = cupsdStatBufUpdate(job->status_buffer, &loglevel,
message, sizeof(message))) != NULL)
{
job->sheets->values[0].integer += copies;
- if (printer->page_limit)
+ if (job->printer->page_limit)
{
- cupsd_quota_t *q = cupsdUpdateQuota(printer, job->username,
+ cupsd_quota_t *q = cupsdUpdateQuota(job->printer, job->username,
copies, 0);
#ifdef __APPLE__
* Quota limit exceeded, cancel job in progress immediately...
*/
- cupsdLogJob(job, CUPSD_LOG_INFO,
- "Canceled because pages exceed user %s "
- "quota limit on printer %s (%s).",
- job->username, printer->name,
- printer->info);
-
- cupsdCancelJob(job, 1, IPP_JOB_CANCELED);
+ cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT,
+ "Canceled job because pages exceed user %s "
+ "quota limit on printer %s (%s).",
+ job->username, job->printer->name,
+ job->printer->info);
return;
}
#else
cupsdLogPage(job, message);
if (job->sheets)
- cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, printer, job,
+ cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
"Printed %d page(s).", job->sheets->values[0].integer);
}
else if (loglevel == CUPSD_LOG_STATE)
if (!strcmp(message, "paused"))
{
- cupsdStopPrinter(printer, 1);
+ cupsdStopPrinter(job->printer, 1);
return;
}
else
{
- cupsdSetPrinterReasons(printer, message);
- cupsdAddPrinterHistory(printer);
+ cupsdSetPrinterReasons(job->printer, message);
+ cupsdAddPrinterHistory(job->printer);
event |= CUPSD_EVENT_PRINTER_STATE;
}
if ((attr = cupsGetOption("auth-info-required", num_attrs,
attrs)) != NULL)
{
- cupsdSetAuthInfoRequired(printer, attr, NULL);
- cupsdSetPrinterAttrs(printer);
+ cupsdSetAuthInfoRequired(job->printer, attr, NULL);
+ cupsdSetPrinterAttrs(job->printer);
- if (printer->type & CUPS_PRINTER_DISCOVERED)
+ if (job->printer->type & CUPS_PRINTER_DISCOVERED)
cupsdMarkDirty(CUPSD_DIRTY_REMOTE);
else
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
job->progress = progress;
if (job->sheets)
- cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, printer, job,
+ cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job,
"Printing page %d, %d%%",
job->sheets->values[0].integer, job->progress);
}
if ((attr = cupsGetOption("printer-alert", num_attrs, attrs)) != NULL)
{
- cupsdSetString(&printer->alert, attr);
+ cupsdSetString(&job->printer->alert, attr);
event |= CUPSD_EVENT_PRINTER_STATE;
}
if ((attr = cupsGetOption("printer-alert-description", num_attrs,
attrs)) != NULL)
{
- cupsdSetString(&printer->alert_description, attr);
+ cupsdSetString(&job->printer->alert_description, attr);
event |= CUPSD_EVENT_PRINTER_STATE;
}
if ((attr = cupsGetOption("marker-colors", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-colors", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-colors", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("marker-levels", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-levels", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-levels", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("marker-low-levels", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-low-levels", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-low-levels", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("marker-high-levels", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-high-levels", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-high-levels", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("marker-message", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-message", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-message", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("marker-names", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-names", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-names", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
if ((attr = cupsGetOption("marker-types", num_attrs, attrs)) != NULL)
{
- cupsdSetPrinterAttr(printer, "marker-types", (char *)attr);
- printer->marker_time = time(NULL);
+ cupsdSetPrinterAttr(job->printer, "marker-types", (char *)attr);
+ job->printer->marker_time = time(NULL);
event |= CUPSD_EVENT_PRINTER_STATE;
cupsdMarkDirty(CUPSD_DIRTY_PRINTERS);
}
num_keywords = cupsParseOptions(message, 0, &keywords);
- if (cupsdUpdatePrinterPPD(printer, num_keywords, keywords))
- cupsdSetPrinterAttrs(printer);
+ if (cupsdUpdatePrinterPPD(job->printer, num_keywords, keywords))
+ cupsdSetPrinterAttrs(job->printer);
cupsFreeOptions(num_keywords, keywords);
}
if (*ptr)
{
- cupsdSetPrinterReasons(printer, "+com.apple.print.recoverable-warning");
- cupsdSetString(&(printer->recoverable), ptr);
- cupsdAddPrinterHistory(printer);
+ cupsdSetPrinterReasons(job->printer,
+ "+com.apple.print.recoverable-warning");
+ cupsdSetString(&(job->printer->recoverable), ptr);
+ cupsdAddPrinterHistory(job->printer);
event |= CUPSD_EVENT_PRINTER_STATE;
}
}
else if (!strncmp(message, "recovered:", 10))
{
- cupsdSetPrinterReasons(printer, "-com.apple.print.recoverable-warning");
+ cupsdSetPrinterReasons(job->printer,
+ "-com.apple.print.recoverable-warning");
ptr = message + 10;
while (isspace(*ptr & 255))
ptr ++;
- cupsdSetString(&(printer->recoverable), ptr);
- cupsdAddPrinterHistory(printer);
+ cupsdSetString(&(job->printer->recoverable), ptr);
+ cupsdAddPrinterHistory(job->printer);
event |= CUPSD_EVENT_PRINTER_STATE;
}
#endif /* __APPLE__ */
else
{
- cupsdLogJob(job, loglevel, "%s", message);
+ if (loglevel != CUPSD_LOG_INFO && loglevel > LogLevel)
+ cupsdLogJob(job, loglevel, "%d %s", loglevel, message);
if (loglevel < CUPSD_LOG_DEBUG)
{
- strlcpy(printer->state_message, message,
- sizeof(printer->state_message));
- cupsdAddPrinterHistory(printer);
+ strlcpy(job->printer->state_message, message,
+ sizeof(job->printer->state_message));
+ cupsdAddPrinterHistory(job->printer);
event |= CUPSD_EVENT_PRINTER_STATE;
if (loglevel <= job->status_level)
{
/*
- * Some messages show in the printer-state-message attribute...
+ * Some messages show in the job-printer-state-message attribute...
*/
if (loglevel != CUPSD_LOG_NOTICE)
}
if (event & CUPSD_EVENT_PRINTER_STATE)
- cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL,
- (printer->type & CUPS_PRINTER_CLASS) ?
+ cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, job->printer, NULL,
+ (job->printer->type & CUPS_PRINTER_CLASS) ?
"Class \"%s\" state changed." :
"Printer \"%s\" state changed.",
- printer->name);
+ job->printer->name);
if (ptr == NULL && !job->status_buffer->bufused)
{
* Handle the end of job stuff...
*/
- cupsdFinishJob(job);
+ finalize_job(job);
+
+ /*
+ * Check for new jobs...
+ */
+
+ cupsdCheckJobs();
}
}
void
update_job_attrs(cupsd_job_t *job, /* I - Job to update */
- int do_message)/* I - 1 = update job-printer-state message */
+ int do_message)/* I - 1 = copy job-printer-state message */
{
int i; /* Looping var */
- cupsd_printer_t *printer; /* Printer for job */
int num_reasons; /* Actual number of reasons */
const char * const *reasons; /* Reasons */
static const char *none = "none"; /* "none" reason */
"job-printer-state-reasons",
IPP_TAG_KEYWORD);
- if ((printer = job->printer) == NULL)
- printer = cupsdFindDest(job->dest);
-
- if (!printer)
- return;
-
/*
- * Otherwise copy the printer-state-message value...
+ * Copy or clear the printer-state-message value as needed...
*/
- if (printer->state_message[0] &&
- (do_message || !job->printer_message->values[0].string.text[0]))
+ if (job->state_value != IPP_JOB_PROCESSING &&
+ job->status_level == CUPSD_LOG_INFO)
+ cupsdSetString(&(job->printer_message->values[0].string.text), "");
+ else if (job->printer->state_message[0] && do_message)
cupsdSetString(&(job->printer_message->values[0].string.text),
- printer->state_message);
-
+ job->printer->state_message);
+
/*
* ... and the printer-state-reasons value...
*/
- if (printer->num_reasons == 0)
+ if (job->printer->num_reasons == 0)
{
num_reasons = 1;
reasons = &none;
}
else
{
- num_reasons = printer->num_reasons;
- reasons = (const char * const *)printer->reasons;
+ num_reasons = job->printer->num_reasons;
+ reasons = (const char * const *)job->printer->reasons;
}
if (!job->printer_reasons || job->printer_reasons->num_values != num_reasons)
{
+ /*
+ * Replace/create a job-printer-state-reasons attribute...
+ */
+
ippDeleteAttribute(job->attrs, job->printer_reasons);
job->printer_reasons = ippAddStrings(job->attrs,
"job-printer-state-reasons",
num_reasons, NULL, NULL);
}
- else if (job->printer_reasons)
+ else
{
- for (i = 0; i < job->printer_reasons->num_values; i ++)
+ /*
+ * Don't bother clearing the reason strings if they are the same...
+ */
+
+ for (i = 0; i < num_reasons; i ++)
+ if (strcmp(job->printer_reasons->values[i].string.text, reasons[i]))
+ break;
+
+ if (i >= num_reasons)
+ return;
+
+ /*
+ * Not the same, so free the current strings...
+ */
+
+ for (i = 0; i < num_reasons; i ++)
_cupsStrFree(job->printer_reasons->values[i].string.text);
}
+ /*
+ * Copy the reasons...
+ */
+
for (i = 0; i < num_reasons; i ++)
job->printer_reasons->values[i].string.text = _cupsStrAlloc(reasons[i]);
}
* file is missing or damaged, see the license at "http://www.cups.org/".
*/
+/*
+ * Constants...
+ */
+
+typedef enum cupsd_jobaction_e /**** Actions for state changes ****/
+{
+ CUPSD_JOB_DEFAULT, /* Use default action */
+ CUPSD_JOB_FORCE, /* Force the change */
+ CUPSD_JOB_PURGE /* Force the change and purge */
+} cupsd_jobaction_t;
+
+
/*
* Job request structure...
*/
priority, /* Job priority */
dirty; /* Do we need to write the "c" file? */
ipp_jstate_t state_value; /* Cached job-state */
- int pending_timeout;/* Non-zero if the job was created and waiting on files */
+ int pending_timeout;/* Non-zero if the job was created and
+ * waiting on files */
char *username; /* Printing user */
char *dest; /* Destination printer or class */
- cups_ptype_t dtype; /* Destination type (class/remote bits) */
+ cups_ptype_t dtype; /* Destination type */
int num_files; /* Number of files in job */
mime_type_t **filetypes; /* File types */
int *compressions; /* Compression status of each file */
side_pipes[2], /* Sidechannel pipes */
status_pipes[2];/* Status pipes */
cupsd_statbuf_t *status_buffer; /* Status buffer for this job */
- int status_level; /* Highest log level in a status message */
+ int status_level; /* Highest log level in a status
+ * message */
int cost; /* Filtering cost */
int filters[MAX_FILTERS + 1];
/* Filter process IDs, 0 terminated */
int status; /* Status code from filters */
cupsd_printer_t *printer; /* Printer this job is assigned to */
int tries; /* Number of tries for this job */
- char *auth_username, /* AUTH_USERNAME environment variable, if any */
- *auth_domain, /* AUTH_DOMAIN environment variable, if any */
- *auth_password; /* AUTH_PASSWORD environment variable, if any */
+ char *auth_username, /* AUTH_USERNAME environment variable,
+ * if any */
+ *auth_domain, /* AUTH_DOMAIN environment variable,
+ * if any */
+ *auth_password; /* AUTH_PASSWORD environment variable,
+ * if any */
void *profile; /* Security profile */
int progress; /* Printing progress */
#ifdef HAVE_GSSAPI
*/
extern cupsd_job_t *cupsdAddJob(int priority, const char *dest);
-extern void cupsdCancelJob(cupsd_job_t *job, int purge,
- ipp_jstate_t newstate);
extern void cupsdCancelJobs(const char *dest, const char *username,
int purge);
extern void cupsdCheckJobs(void);
extern void cupsdCleanJobs(void);
-extern void cupsdDeleteJob(cupsd_job_t *job);
+extern void cupsdContinueJob(cupsd_job_t *job);
+extern void cupsdDeleteJob(cupsd_job_t *job,
+ cupsd_jobaction_t action);
extern cupsd_job_t *cupsdFindJob(int id);
-extern void cupsdFinishJob(cupsd_job_t *job);
extern void cupsdFreeAllJobs(void);
extern int cupsdGetPrinterJobCount(const char *dest);
extern int cupsdGetUserJobCount(const char *username);
-extern void cupsdHoldJob(cupsd_job_t *job);
extern void cupsdLoadAllJobs(void);
extern int cupsdLoadJob(cupsd_job_t *job);
extern void cupsdMoveJob(cupsd_job_t *job, cupsd_printer_t *p);
extern void cupsdRestartJob(cupsd_job_t *job);
extern void cupsdSaveAllJobs(void);
extern void cupsdSaveJob(cupsd_job_t *job);
-extern void cupsdSetJobHoldUntil(cupsd_job_t *job, const char *when);
+extern void cupsdSetJobHoldUntil(cupsd_job_t *job,
+ const char *when, int update);
extern void cupsdSetJobPriority(cupsd_job_t *job, int priority);
-extern void cupsdStopAllJobs(int force);
-extern void cupsdStopJob(cupsd_job_t *job, int force);
+extern void cupsdSetJobState(cupsd_job_t *job,
+ ipp_jstate_t newstate,
+ cupsd_jobaction_t action,
+ const char *message, ...)
+#ifdef __GNUC__
+__attribute__ ((__format__ (__printf__, 4, 5)))
+#endif /* __GNUC__ */
+;
+extern void cupsdStopAllJobs(cupsd_jobaction_t action);
extern int cupsdTimeoutJob(cupsd_job_t *job);
extern void cupsdUnloadCompletedJobs(void);
while (!stop_scheduler)
{
-#ifdef DEBUG
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "main: Top of loop, dead_children=%d, NeedReload=%d",
- dead_children, NeedReload);
-#endif /* DEBUG */
-
/*
* Check if there are dead children to handle...
*/
process_children(void)
{
int status; /* Exit status of child */
- int pid; /* Process ID of child */
+ int pid, /* Process ID of child */
+ job_id; /* Job ID of child */
cupsd_job_t *job; /* Current job */
int i; /* Looping var */
char name[1024]; /* Process name */
* Collect the name of the process that finished...
*/
- cupsdFinishProcess(pid, name, sizeof(name));
+ cupsdFinishProcess(pid, name, sizeof(name), &job_id);
/*
* Delete certificates for CGI processes...
cupsdDeleteCert(pid);
/*
- * Lookup the PID in the jobs list...
+ * Handle completed job filters...
*/
- for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs);
- job;
- job = (cupsd_job_t *)cupsArrayNext(ActiveJobs))
- if (job->state_value >= IPP_JOB_HELD && (job->filters[0] || job->backend))
+ if (job_id > 0 && (job = cupsdFindJob(job_id)) != NULL)
+ {
+ for (i = 0; job->filters[i]; i ++)
+ if (job->filters[i] == pid)
+ break;
+
+ if (job->filters[i] || job->backend == pid)
{
- for (i = 0; job->filters[i]; i ++)
- if (job->filters[i] == pid)
- break;
+ /*
+ * OK, this process has gone away; what's left?
+ */
+
+ if (job->filters[i])
+ job->filters[i] = -pid;
+ else
+ job->backend = -pid;
- if (job->filters[i] || job->backend == pid)
+ if (status && status != SIGTERM && status != SIGKILL &&
+ job->status >= 0)
{
/*
- * OK, this process has gone away; what's left?
+ * An error occurred; save the exit status so we know to stop
+ * the printer or cancel the job when all of the filters finish...
+ *
+ * A negative status indicates that the backend failed and the
+ * printer needs to be stopped.
*/
- if (job->filters[i])
- job->filters[i] = -pid;
+ if (job->filters[i])
+ job->status = status; /* Filter failed */
else
- job->backend = -pid;
+ job->status = -status; /* Backend failed */
- if (status && job->status >= 0)
+ if (!(job->printer->type & CUPS_PRINTER_FAX) &&
+ job->status_level >= CUPSD_LOG_ERROR)
{
- /*
- * An error occurred; save the exit status so we know to stop
- * the printer or cancel the job when all of the filters finish...
- *
- * A negative status indicates that the backend failed and the
- * printer needs to be stopped.
- */
+ job->status_level = CUPSD_LOG_ERROR;
- if (job->filters[i])
- job->status = status; /* Filter failed */
- else
- job->status = -status; /* Backend failed */
+ snprintf(job->printer->state_message,
+ sizeof(job->printer->state_message), "%s failed", name);
+ cupsdAddPrinterHistory(job->printer);
- if (job->printer && !(job->printer->type & CUPS_PRINTER_FAX) &&
- job->status_level > CUPSD_LOG_ERROR)
+ if (!job->printer_message)
{
- job->status_level = CUPSD_LOG_ERROR;
-
- snprintf(job->printer->state_message,
- sizeof(job->printer->state_message), "%s failed", name);
- cupsdAddPrinterHistory(job->printer);
+ if ((job->printer_message =
+ ippFindAttribute(job->attrs, "job-printer-state-message",
+ IPP_TAG_TEXT)) == NULL)
+ job->printer_message = ippAddString(job->attrs, IPP_TAG_JOB,
+ IPP_TAG_TEXT,
+ "job-printer-state-message",
+ NULL, "");
}
+
+ cupsdSetString(&(job->printer_message->values[0].string.text),
+ job->printer->state_message);
}
+ }
- /*
- * If this is not the last file in a job, see if all of the
- * filters are done, and if so move to the next file.
- */
+ /*
+ * If this is not the last file in a job, see if all of the
+ * filters are done, and if so move to the next file.
+ */
- if (job->current_file < job->num_files)
- {
- for (i = 0; job->filters[i] < 0; i ++);
+ if (job->current_file < job->num_files)
+ {
+ for (i = 0; job->filters[i] < 0; i ++);
- if (!job->filters[i])
- {
- /*
- * Process the next file...
- */
+ if (!job->filters[i])
+ {
+ /*
+ * Process the next file...
+ */
- cupsdFinishJob(job);
- }
+ cupsdContinueJob(job);
}
- break;
}
}
+ }
/*
* Show the exit status as needed, ignoring SIGTERM and SIGKILL errors
free(p->history);
}
+ delete_printer_filters(p);
+
for (i = 0; i < p->num_reasons; i ++)
_cupsStrFree(p->reasons[i]);
ippDelete(p->attrs);
ippDelete(p->ppd_attrs);
- delete_printer_filters(p);
-
mimeDeleteType(MimeDatabase, p->filetype);
mimeDeleteType(MimeDatabase, p->prefiltertype);
}
else if (!strcasecmp(line, "Reason"))
{
- if (value)
+ 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"))
{
for (i = 0 ; i < p->num_reasons; i ++)
if (!strcmp(value, p->reasons[i]))
cupsFilePrintf(fp, "StateTime %d\n", (int)printer->state_time);
for (i = 0; i < printer->num_reasons; i ++)
- if (strcmp(printer->reasons[i], "connecting-to-device") &&
+ 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"))
cupsFilePutConf(fp, "Reason", printer->reasons[i]);
}
}
+ if ((oldattr = ippFindAttribute(oldattrs, "marker-low-levels",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "marker-low-levels", oldattr->num_values,
+ NULL)) != NULL)
+ {
+ for (i = 0; i < oldattr->num_values; i ++)
+ attr->values[i].integer = oldattr->values[i].integer;
+ }
+ }
+
+ if ((oldattr = ippFindAttribute(oldattrs, "marker-high-levels",
+ IPP_TAG_INTEGER)) != NULL)
+ {
+ if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER,
+ "marker-high-levels", oldattr->num_values,
+ NULL)) != NULL)
+ {
+ for (i = 0; i < oldattr->num_values; i ++)
+ attr->values[i].integer = oldattr->values[i].integer;
+ }
+ }
+
if ((oldattr = ippFindAttribute(oldattrs, "marker-names",
IPP_TAG_NAME)) != NULL)
{
*rptr; /* Pointer into reason */
- if (!p || !s)
- {
- cupsdLogMessage(CUPSD_LOG_EMERG,
- "cupsdSetPrinterReasons called with p=%p and s=%p!", p, s);
- return;
- }
-
- if (LogLevel == CUPSD_LOG_DEBUG2)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetPrinterReasons: num_reasons=%d",
- p->num_reasons);
- for (i = 0; i < p->num_reasons; i ++)
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdSetPrinterReasons: reasons[%d]=%p(\"%s\")", i,
- p->reasons[i], p->reasons[i]);
- }
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s);
if (s[0] == '-' || s[0] == '+')
{
}
}
}
-
- if (LogLevel == CUPSD_LOG_DEBUG2)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdSetPrinterReasons: NEW num_reasons=%d",
- p->num_reasons);
- for (i = 0; i < p->num_reasons; i ++)
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdSetPrinterReasons: NEW reasons[%d]=%p(\"%s\")", i,
- p->reasons[i], p->reasons[i]);
- }
}
#endif /* __sgi */
}
+ /*
+ * Set/clear the paused reason as needed...
+ */
+
if (s == IPP_PRINTER_STOPPED)
cupsdSetPrinterReasons(p, "+paused");
else
cupsdSetPrinterReasons(p, "-paused");
+ /*
+ * Clear the message for the queue when going to processing...
+ */
+
+ if (s == IPP_PRINTER_PROCESSING)
+ p->state_message[0] = '\0';
+
+ /*
+ * Update the printer history...
+ */
+
cupsdAddPrinterHistory(p);
/*
* to stopped (or visa-versa)...
*/
- if ((old_state == IPP_PRINTER_STOPPED) != (s == IPP_PRINTER_STOPPED) &&
- update)
+ if (update &&
+ (old_state == IPP_PRINTER_STOPPED) != (s == IPP_PRINTER_STOPPED))
{
if (p->type & CUPS_PRINTER_CLASS)
cupsdMarkDirty(CUPSD_DIRTY_CLASSES);
cupsdStopPrinter(cupsd_printer_t *p, /* I - Printer to stop */
int update)/* I - Update printers.conf? */
{
- cupsd_job_t *job; /* Active print job */
-
-
/*
* Set the printer state...
*/
*/
if (p->job)
- {
- /*
- * Get pointer to job...
- */
-
- job = (cupsd_job_t *)p->job;
-
- /*
- * Stop it...
- */
-
- cupsdStopJob(job, 0);
-
- /*
- * Reset the state to pending...
- */
-
- job->state->values[0].integer = IPP_JOB_PENDING;
- job->state_value = IPP_JOB_PENDING;
- job->dirty = 1;
-
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job,
- "Job stopped due to printer being paused");
- }
+ cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT,
+ "Job stopped due to printer being paused.");
}
mimeDeleteFilter(MimeDatabase, filter);
}
+
+ cupsdSetPrinterReasons(p, "-cups-insecure-filter-error"
+ ",cups-missing-filter-error");
}
if (ppd->num_sizes == 0)
{
- cupsdLogMessage(CUPSD_LOG_CRIT,
- "The PPD file for printer %s contains no media "
- "options and is therefore invalid!", p->name);
+ if (!ppdFindAttr(ppd, "APScannerOnly", NULL))
+ cupsdLogMessage(CUPSD_LOG_CRIT,
+ "The PPD file for printer %s contains no media "
+ "options and is therefore invalid!", p->name);
+
+ ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD,
+ "media-supported", NULL, "unknown");
}
else
{
else
p->type |= CUPS_PRINTER_SMALL;
+ if ((ppd_attr = ppdFindAttr(ppd, "APICADriver", NULL)) != NULL &&
+ ppd_attr->value && !strcasecmp(ppd_attr->value, "true"))
+ {
+ if ((ppd_attr = ppdFindAttr(ppd, "APScannerOnly", NULL)) != NULL &&
+ ppd_attr->value && !strcasecmp(ppd_attr->value, "true"))
+ p->type |= CUPS_PRINTER_SCANNER;
+ else
+ p->type |= CUPS_PRINTER_MFP;
+ }
+
/*
* Add a filter from application/vnd.cups-raw to printer/name to
* handle "raw" printing by users.
typedef struct
{
- int pid; /* Process ID */
+ int pid, /* Process ID */
+ job_id; /* Job associated with process */
char name[1]; /* Name of process */
} cupsd_proc_t;
temp[1024]; /* Quoted TempDir */
+ if (RunUser)
+ {
+ /*
+ * Only use sandbox profiles as root...
+ */
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
+ job_id);
+
+ return (NULL);
+ }
+
if ((fp = cupsTempFile2(profile, sizeof(profile))) == NULL)
{
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
+ job_id);
cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create security profile: %s",
strerror(errno));
return (NULL);
cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = \"%s\"",
job_id, profile);
return ((void *)strdup(profile));
+
#else
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL",
+ job_id);
return (NULL);
#endif /* HAVE_SANDBOX_H */
void
cupsdDestroyProfile(void *profile) /* I - Profile */
{
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteProfile(profile=\"%s\")",
+ profile ? (char *)profile : "(null)");
+
#ifdef HAVE_SANDBOX_H
if (profile)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteProfile(profile=\"%s\")",
- (char *)profile);
unlink((char *)profile);
free(profile);
}
cupsdEndProcess(int pid, /* I - Process ID */
int force) /* I - Force child to die */
{
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdEndProcess(pid=%d, force=%d)", pid,
+ force);
+
if (force)
return (kill(pid, SIGKILL));
else
const char * /* O - Process name */
cupsdFinishProcess(int pid, /* I - Process ID */
char *name, /* I - Name buffer */
- int namelen) /* I - Size of name buffer */
+ int namelen, /* I - Size of name buffer */
+ int *job_id) /* O - Job ID pointer or NULL */
{
cupsd_proc_t key, /* Search key */
*proc; /* Matching process */
if ((proc = (cupsd_proc_t *)cupsArrayFind(process_array, &key)) != NULL)
{
+ if (job_id)
+ *job_id = proc->job_id;
+
strlcpy(name, proc->name, namelen);
cupsArrayRemove(process_array, proc);
free(proc);
-
- return (name);
}
else
- return ("unknown");
+ {
+ if (job_id)
+ *job_id = 0;
+
+ strlcpy(name, "unknown", namelen);
+ }
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "cupsdFinishProcess(pid=%d, name=%p, namelen=%d, "
+ "job_id=%p(%d)) = \"%s\"", pid, name, namelen, job_id,
+ job_id ? *job_id : 0, name);
+
+ return (name);
}
int /* O - Process ID or 0 */
cupsdStartProcess(
- const char *command, /* I - Full path to command */
- char *argv[], /* I - Command-line arguments */
- char *envp[], /* I - Environment */
- int infd, /* I - Standard input file descriptor */
- int outfd, /* I - Standard output file descriptor */
- int errfd, /* I - Standard error file descriptor */
- int backfd, /* I - Backchannel file descriptor */
- int sidefd, /* I - Sidechannel file descriptor */
- int root, /* I - Run as root? */
- void *profile, /* I - Security profile to use */
- int *pid) /* O - Process ID */
+ const char *command, /* I - Full path to command */
+ char *argv[], /* I - Command-line arguments */
+ char *envp[], /* I - Environment */
+ int infd, /* I - Standard input file descriptor */
+ int outfd, /* I - Standard output file descriptor */
+ int errfd, /* I - Standard error file descriptor */
+ int backfd, /* I - Backchannel file descriptor */
+ 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 */
+ int *pid) /* O - Process ID */
{
int user; /* Command UID */
struct stat commandinfo; /* Command file information */
#endif /* __APPLE__ */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdStartProcess(\"%s\", %p, %p, %d, %d, %d)",
- command, argv, envp, infd, outfd, errfd);
-
if (RunUser)
user = RunUser;
else if (root)
if (stat(command, &commandinfo))
{
+ *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",
+ command, argv, envp, infd, outfd, errfd, backfd, sidefd,
+ root, profile, job_id, pid, *pid);
cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to execute %s: %s", command,
strerror(errno));
- *pid = 0;
return (0);
}
else if (commandinfo.st_mode & 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",
+ command, argv, envp, infd, outfd, errfd, backfd, sidefd,
+ root, profile, job_id, pid, *pid);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to execute %s: insecure file permissions (0%o)",
command, commandinfo.st_mode);
- *pid = 0;
+
errno = EPERM;
return (0);
}
(commandinfo.st_gid != Group || !(commandinfo.st_mode & S_IXGRP)) &&
!(commandinfo.st_mode & S_IXOTH))
{
+ *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",
+ command, argv, envp, infd, outfd, errfd, backfd, sidefd,
+ root, profile, job_id, pid, *pid);
cupsdLogMessage(CUPSD_LOG_ERROR,
"Unable to execute %s: no execute permissions (0%o)",
command, commandinfo.st_mode);
- *pid = 0;
+
errno = EPERM;
return (0);
}
{
if ((proc = calloc(1, sizeof(cupsd_proc_t) + strlen(command))) != NULL)
{
- proc->pid = *pid;
+ proc->pid = *pid;
+ proc->job_id = job_id;
strcpy(proc->name, command);
cupsArrayAdd(process_array, proc);
cupsdReleaseSignals();
+ 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",
+ command, argv, envp, infd, outfd, errfd, backfd, sidefd,
+ root, profile, job_id, pid, *pid);
+
return (*pid);
}
attr = ippFindAttribute(job->attrs, "time-at-creation",
IPP_TAG_INTEGER);
- if (!attr)
- {
- /*
- * This should never happen since cupsdLoadJob() checks for
- * time-at-creation, but if it does just ignore this job...
- */
-
- continue;
- }
-
if (attr->values[0].integer < curtime)
{
/*
* This job is too old to count towards the quota, ignore it...
*/
- if (JobAutoPurge)
- cupsdCancelJob(job, 1, IPP_JOB_CANCELED);
+ if (JobAutoPurge && !job->printer && job->state_value > IPP_JOB_STOPPED)
+ cupsdDeleteJob(job, CUPSD_JOB_PURGE);
continue;
}
*
* Select abstraction functions for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 2006-2007 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
*/
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: fd=%d, read_cb=%p, write_cb=%p, data=%p",
+ "cupsdAddSelect(fd=%d, read_cb=%p, write_cb=%p, data=%p)",
fd, read_cb, write_cb, data);
if (fd < 0)
if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: kevent() returned %s",
+ cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s",
strerror(errno));
return (0);
}
if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: kevent() returned %s",
+ cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s",
strerror(errno));
return (0);
}
*/
if (read_cb)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: Adding fd %d to input set...", fd);
FD_SET(fd, &cupsd_global_input);
- }
else
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: Removing fd %d from input set...", fd);
FD_CLR(fd, &cupsd_global_input);
FD_CLR(fd, &cupsd_current_input);
}
if (write_cb)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: Adding fd %d to output set...", fd);
FD_SET(fd, &cupsd_global_output);
- }
else
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdAddSelect: Removing fd %d from output set...", fd);
FD_CLR(fd, &cupsd_global_output);
FD_CLR(fd, &cupsd_current_output);
}
struct timespec ktimeout; /* kevent() timeout */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDoSelect: polling %d fds for %ld seconds...",
- cupsArrayCount(cupsd_fds), timeout);
-
cupsd_in_select = 1;
if (timeout >= 0 && timeout < 86400)
else
nfds = kevent(cupsd_kqueue_fd, NULL, 0, cupsd_kqueue_events, MaxFDs, NULL);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDoSelect: kevent(%d, ..., %d, ...) returned %d...",
- cupsd_kqueue_fd, MaxFDs, nfds);
-
cupsd_kqueue_changes = 0;
for (i = nfds, event = cupsd_kqueue_events; i > 0; i --, event ++)
if (cupsArrayFind(cupsd_inactive_fds, fdptr))
continue;
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "event->filter=%d, event->ident=%d",
- event->filter, (int)event->ident);
-
retain_fd(fdptr);
if (fdptr->read_cb && event->filter == EVFILT_READ)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...",
- fdptr->fd);
(*(fdptr->read_cb))(fdptr->data);
- }
if (fdptr->write_cb && event->filter == EVFILT_WRITE)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...",
- fdptr->fd);
(*(fdptr->write_cb))(fdptr->data);
- }
release_fd(fdptr);
}
int count; /* Number of file descriptors */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDoSelect: polling %d fds for %ld seconds...",
- cupsArrayCount(cupsd_fds), timeout);
-
# ifdef HAVE_EPOLL
cupsd_in_select = 1;
else
nfds = epoll_wait(cupsd_epoll_fd, cupsd_epoll_events, MaxFDs, -1);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: epoll() returned %d...",
- nfds);
-
if (nfds < 0 && errno != EINTR)
{
close(cupsd_epoll_fd);
retain_fd(fdptr);
if (fdptr->read_cb && (event->events & (EPOLLIN | EPOLLERR | EPOLLHUP)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...",
- fdptr->fd);
(*(fdptr->read_cb))(fdptr->data);
- }
if (fdptr->write_cb && (event->events & (EPOLLOUT | EPOLLERR | EPOLLHUP)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...",
- fdptr->fd);
(*(fdptr->write_cb))(fdptr->data);
- }
release_fd(fdptr);
}
cupsd_update_pollfds = 0;
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Updating pollfd array...");
-
/*
* (Re)allocate memory as needed...
*/
}
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDoSelect: polling %d fds for %ld seconds...",
- count, timeout);
-
if (timeout >= 0 && timeout < 86400)
nfds = poll(cupsd_pollfds, count, timeout * 1000);
else
nfds = poll(cupsd_pollfds, count, -1);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: poll() returned %d...",
- nfds);
-
if (nfds > 0)
{
/*
for (pfd = cupsd_pollfds; count > 0; pfd ++, count --)
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDoSelect: pollfds[%d]={fd=%d, revents=%x}",
- (int)(pfd - cupsd_pollfds), pfd->fd, pfd->revents);
-
if (!pfd->revents)
continue;
retain_fd(fdptr);
if (fdptr->read_cb && (pfd->revents & (POLLIN | POLLERR | POLLHUP)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...",
- fdptr->fd);
(*(fdptr->read_cb))(fdptr->data);
- }
if (fdptr->write_cb && (pfd->revents & (POLLOUT | POLLERR | POLLHUP)))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...",
- fdptr->fd);
(*(fdptr->write_cb))(fdptr->data);
- }
release_fd(fdptr);
}
cupsd_current_input = cupsd_global_input;
cupsd_current_output = cupsd_global_output;
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdDoSelect: selecting %d fds for %ld seconds...",
- maxfd, timeout);
-
if (timeout >= 0 && timeout < 86400)
{
stimeout.tv_sec = timeout;
nfds = select(maxfd, &cupsd_current_input, &cupsd_current_output, NULL,
NULL);
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: select() returned %d...",
- nfds);
-
if (nfds > 0)
{
/*
retain_fd(fdptr);
if (fdptr->read_cb && FD_ISSET(fdptr->fd, &cupsd_current_input))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...",
- fdptr->fd);
(*(fdptr->read_cb))(fdptr->data);
- }
if (fdptr->write_cb && FD_ISSET(fdptr->fd, &cupsd_current_output))
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...",
- fdptr->fd);
(*(fdptr->write_cb))(fdptr->data);
- }
release_fd(fdptr);
}
* Range check input...
*/
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRemoveSelect: fd=%d", fd);
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRemoveSelect(fd=%d)", fd);
if (fd < 0)
return;
if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdRemoveSelect: kevent() returned %s",
+ cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s",
strerror(errno));
return;
}
if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout))
{
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdRemoveSelect: kevent() returned %s",
+ cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s",
strerror(errno));
return;
}
cupsd_update_pollfds = 1;
#else /* select() */
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdRemoveSelect: Removing fd %d from input and output "
- "sets...", fd);
FD_CLR(fd, &cupsd_global_input);
FD_CLR(fd, &cupsd_global_output);
FD_CLR(fd, &cupsd_current_input);
void
cupsdStartSelect(void)
{
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSelect()");
+
cupsd_fds = cupsArrayNew((cups_array_func_t)compare_fds, NULL);
#if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE)
_cupsd_fd_t *fdptr; /* Current file descriptor */
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSelect()");
+
for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds);
fdptr;
fdptr = (_cupsd_fd_t *)cupsArrayNext(cupsd_fds))
*/
cupsd_statbuf_t * /* O - New status buffer */
-cupsdStatBufNew(int fd, /* I - File descriptor of pipe */
+cupsdStatBufNew(int fd, /* I - File descriptor of pipe */
const char *prefix, /* I - Printf-style prefix string */
...) /* I - Additional args as needed */
{
*
* Subscription routines for the Common UNIX Printing System (CUPS) scheduler.
*
- * Copyright 2007-2008 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
*/
if (cupsdStartProcess(command, argv, envp, fds[0], -1, NotifierPipes[1],
- -1, -1, 0, DefaultProfile, &pid) < 0)
+ -1, -1, 0, DefaultProfile, 0, &pid) < 0)
{
/*
* Error - can't fork!
*
* Mini-daemon utility definitions for the Common UNIX Printing System (CUPS).
*
- * Copyright 2007-2008 by Apple Inc.
+ * Copyright 2007-2009 by Apple Inc.
* Copyright 1997-2005 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* Include necessary headers...
*/
-# include <cups/cups.h>
-# include <cups/file.h>
-# include <cups/string.h>
-# include <stdlib.h>
-# include <errno.h>
+# include <cups/file-private.h>
# include <signal.h>
-# include <dirent.h>
/*
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Dodawanie klasy</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Może zawierać wszystkie drukowalne znaki, oprócz "/", "#" i spacji)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Członkowie:</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="Dodaj klasę"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Dodawanie drukarki</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">Nazwa:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?template_name}"><BR>
+<SMALL>(Może zawierać wszystkie drukowalne znaki, oprócz "/", "#" i spacji)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_INFO}"><BR>
+<SMALL>(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127" VALUE="{?PRINTER_LOCATION}"><BR>
+<SMALL>(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Połączenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Współdzielenie:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+Współdzielenie tej drukarki</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Kontynuuj"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription">
+
+<H2 CLASS="title">Dodawanie subskrypcji RSS</H2>
+
+<TABLE SUMMARY="Formularz dodawania subskrypcji RSS">
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD COLSPAN="5"><INPUT TYPE="TEXT" NAME="SUBSCRIPTION_NAME" SIZE="40" MAXLENGTH="127" VALUE="{?SUBSCRIPTION_NAME}"><BR>
+<SMALL>(Może zawierać wszystkie drukowalne znaki, oprócz spacji, "/", "?" i "#")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Kolejka:</TH>
+<TD COLSPAN="5"><SELECT NAME="PRINTER_URI" SIZE="10"><OPTION VALUE="#ALL#"{?PRINTER_URI=#ALL#? SELECTED:}>Wszystkie kolejki</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">Zdarzenia:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CREATED" {?EVENT_JOB_CREATED}>Utworzono zadanie<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_COMPLETED" {?EVENT_JOB_COMPLETED}>Ukończono zadanie<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_STOPPED" {?EVENT_JOB_STOPPED}>Zatrzymano zadanie<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_JOB_CONFIG_CHANGED" {?EVENT_JOB_CONFIG_CHANGED}>Zmieniono opcje zadania</TD>
+<TD> </TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_STOPPED" {?EVENT_PRINTER_STOPPED}>Zatrzymano kolejkę<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_ADDED" {?EVENT_PRINTER_ADDED}>Dodano kolejkę<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_MODIFIED" {?EVENT_PRINTER_MODIFIED}>Zmodyfikowano kolejkę<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_PRINTER_DELETED" {?EVENT_PRINTER_DELETED}>Usunięto kolejkę</TD>
+<TD> </TD>
+<TD><INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STARTED" {?EVENT_SERVER_STARTED}>Uruchomiono serwer<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_STOPPED" {?EVENT_SERVER_STOPPED}>Zatrzymano serwer<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_RESTARTED" {?EVENT_SERVER_RESTARTED}>Ponownie uruchomiono serwer<BR>
+<INPUT TYPE="CHECKBOX" NAME="EVENT_SERVER_AUDIT" {?EVENT_SERVER_AUDIT}>Audytowanie bezpieczeństwa serwera</TD>
+</TR>
+<TR>
+<TH CLASS="label">Maksymalna liczba zdarzeń w kanale:</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="Dodaj subskrypcję RSS"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<TABLE CLASS="indent" SUMMARY="Zadania administracji">
+<TR><TD VALIGN="TOP">
+
+<H2 CLASS="title">Drukarki</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-printer"><INPUT TYPE="SUBMIT" VALUE="Dodawanie drukarki"></FORM>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="find-new-printers"><INPUT TYPE="SUBMIT" VALUE="Wyszukiwanie nowych drukarek"></FORM>
+<FORM ACTION="/printers/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Zarządzanie drukarkami"></FORM>
+{have_samba?<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba"><INPUT TYPE="SUBMIT" VALUE="Eksportowanie drukarek do Samby"></FORM>:}
+</P>
+
+<H2 CLASS="title">Klasy</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-class"><INPUT TYPE="SUBMIT" VALUE="Dodawanie klasy"></FORM>
+<FORM ACTION="/classes/" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Zarządzanie klasami"></FORM>
+</P>
+
+<H2 CLASS="title">Zadania</H2>
+
+<P>
+<FORM ACTION="/jobs/" METHDO="GET"><INPUT TYPE="SUBMIT" VALUE="Zarządzanie zadaniami"></FORM>
+</P>
+
+</TD><TD> </TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Serwery</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server"><INPUT TYPE="SUBMIT" VALUE="Modyfikowanie pliku konfiguracji"></FORM>
+<FORM ACTION="/admin/log/access_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Przeglądanie dziennika dostępu"></FORM>
+<FORM ACTION="/admin/log/error_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Przeglądanie dziennika błędów"></FORM>
+<FORM ACTION="/admin/log/page_log" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Przeglądanie dziennika stron"></FORM>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+{ADVANCEDSETTINGS?<P><B>Ustawienia serwera\:</B></P>
+
+<P><A HREF="/admin/">Zaawansowane <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}> Wyświetlanie drukarek współdzielonych przez inne systemy<BR>
+ Protokoły\:
+<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}> Współdzielenie drukarek podłączonych do tego systemu<BR>
+ Maksymalna liczba klientów\:
+<INPUT TYPE="TEXT" NAME="MAX_CLIENTS" VALUE="{?max_clients}" SIZE="6"><BR>
+ Protokoły\:
+<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}> Zezwolenie na drukowanie z Internetu"<BR>
+ <INPUT TYPE="CHECKBOX" NAME="BROWSE_WEB_IF" {?browse_web_if}> Rozgłaszanie interfejsu WWW<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Zezwolenie na zdalną administrację<BR>
+{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Używanie uwierzytelniania Kerberosa (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Zezwolenie użytkownikom na anulowanie każdego zadania (nie tylko ich własnego)<BR>
+<INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOB_HISTORY" {?preserve_job_history}> Przechowywanie plików zadań<BR>
+ Liczba zadań\:
+<INPUT TYPE="TEXT" NAME="MAX_JOBS" VALUE="{?max_jobs}" SIZE="6"><BR>
+ <INPUT TYPE="CHECKBOX" NAME="PRESERVE_JOB_FILES" {?preserve_job_files}> Przechowywanie plików wydruków zadań<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Zapisywanie informacji debugowania do naprawiania problemów<BR>
+ Maksymalny rozmiar pliku dziennika\:
+<INPUT TYPE="TEXT" NAME="MAX_LOG_SIZE" VALUE="{?max_log_size}" SIZE="6"></P>
+
+:<P><B>Ustawienia serwera:</B></P>
+
+<P><A HREF="/admin/?ADVANCEDSETTINGS=YES">Zaawansowane <SMALL>▶</SMALL></A><BR>
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Wyświetlanie drukarek współdzielonych przez inne systemy<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Współdzielenie drukarek połączonych do tego systemu<BR>
+ <INPUT TYPE="CHECKBOX" NAME="REMOTE_ANY" {?remote_any}> Zezwolenie na drukowanie z Internetu<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Zezwolenie na zdalną administrację<BR>
+{have_gssapi?<INPUT TYPE="CHECKBOX" NAME="KERBEROS" {?kerberos}> Używanie uwierzytelniania Kerberosa (<A HREF="/help/kerberos.html?TOPIC=Getting+Started">FAQ</A>)<BR>:}
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Zezwolenie użytkownikom na anulowanie każdego zadania (nie tylko ich własnego)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Zapisywanie informacji debugowania do naprawiania problemów</P>
+
+}
+<P><INPUT TYPE="SUBMIT" NAME="CHANGESETTINGS" VALUE="Zmień ustawienia"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
+
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Subskrypcje RSS</H2>
+
+<P>
+<FORM ACTION="/admin/" METHOD="POST"><INPUT TYPE="HIDDEN" NAME="OP" VALUE="add-rss-subscription"><INPUT TYPE="SUBMIT" VALUE="Dodawanie subskrypcji RSS"></FORM>
+</P>
+
+</DIV>
+
+{notify_subscription_id?<TABLE CLASS="list" SUMMARY="Subskrypcje RSS">
+<THEAD><TR><TH>Name</TH><TH>Zdarzenia</TH><TH>Nazwa kolejki</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="Anuluj subskrypcję RSS"></FORM> </TD><TD>{notify_events}</TD><TD NOWRAP> {notify_printer_name?{notify_printer_name}:Wszystkie kolejki}</TD></TR>}
+</TBODY>
+</TABLE>:}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}</H2>
+
+{CUPS_GET_DEVICES_DONE?:<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Busy Indicator"> Wyszukiwanie drukarek...</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">Bieżące połączenie:</TH>
+<TD><INPUT TYPE="RADIO" NAME="DEVICE_URI" VALUE="{current_device_uri}" CHECKED>
+{current_device_uri}</TD>
+</TR>}
+<TR>
+<TH CLASS="label">Lokalne drukarki:</TH>
+<TD>
+{[device_uri]{device_class!network?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
+VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+:}}
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Wykryte drukarki sieciowe:</TH>
+<TD>
+{[device_uri]{device_class=network?{device_uri~[a-z]+://?<INPUT TYPE="RADIO" NAME="DEVICE_URI"
+VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+:}:}}
+</TD>
+</TR>
+<TR>
+<TR>
+<TH CLASS="label">Inne drukarki sieciowe:</TH>
+<TD>
+{[device_uri]{device_class=network?{device_uri~[a-z]+://?:<INPUT TYPE="RADIO" NAME="DEVICE_URI"
+VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}">
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}<BR>
+}:}}
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Kontynuuj"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?Modify {printer_name}:Dodawanie drukarki}</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">Nazwa:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>}
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Połączenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Współdzielenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
+{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Współdzielenie tej drukarki</TD>
+</TR>
+<TR>
+<TH CLASS="label">Producent:</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="Kontynuuj"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD> </TD>
+</TR>
+<TR>
+<TH CLASS="label">Lub podaj plik PPD:</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?Dodaj drukarkę:Zmodyfikuj drukarkę}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}</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">Nazwa:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>}
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{printer_info}">{printer_info}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{printer_location}">{printer_location}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Połączenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Współdzielenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_IS_SHARED" VALUE="{?printer_is_shared}">
+{?printer_is_shared=?Nie:{?printer_is_shared=0?Nie:}} współdziel tej drukarki</TD>
+</TR>
+<TR>
+<TH CLASS="label">Producent:</TH>
+<TD>{PPD_MAKE} <INPUT TYPE="SUBMIT" NAME="SELECT_MAKE" VALUE="Wybierz innego producenta"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Model:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{op=add-printer?:<OPTION VALUE="__no_change__" SELECTED>Bieżący sterownik - {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">Lub podaj plik PPD:</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?Dodaj drukarkę:Zmodyfikuj drukarkę}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}</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">Połączenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Prędkość w baudach:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Równorzędność:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>None
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Even
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Odd
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Bity danych:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Kontrola przepływu:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>Brak
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (programowa)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (sprzętowa)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (sprzętowa)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Kontynuuj"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}</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">Połączenie:</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>Przykłady:
+<PRE>
+ http://nazwakomputera:631/ipp/
+ http://nazwakomputera:631/ipp/port1
+
+ ipp://nazwakomputera/ipp/
+ ipp://nazwakomputera/ipp/port1
+
+ lpd://nazwakomputera/kolejka
+
+ socket://nazwakomputera
+ socket://nazwakomputera:9100
+</PRE>
+
+<P>Proszę zobaczyć <A HREF="/help/network.html" TARGET="_blank">"Drukarki
+sieciowe"</A>, aby uzyskać poprawne URI dla drukarki.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Kontynuuj"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Dodawanie klasy</H2>
+
+<P>Klasa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie
+dodana.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Usuwanie klasy {printer_name}</H2>
+
+<P><B>Ostrzeżenie:</B> Usunąć klasę
+{printer_name}?</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="Usuń klasę"></FORM></P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Usuwanie klasy {printer_name}</H2>
+
+<P>Klasa {printer_name} została pomyślnie usunięta.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+<H3 CLASS="title">Zadania</H3>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Modyfikowanie klasy {printer_name}</H2>
+
+<P>Klasa <A HREF="/classes/{printer_name}">{printer_name}</A> została
+pomyślnie zmodyfikowana.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymane}},
+{printer_is_accepting_jobs=0?Odrzucanie zadań:Akceptowanie zadań},
+{server_is_sharing_printers=0?Nie:{printer_is_shared=0?Nie:}} Współdzielona{default_name={printer_name}?, Domyślne serwera:})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Konserwacja</OPTION>
+<OPTION VALUE="print-test-page">Drukowanie strony próbnej</OPTION>
+{printer_state=5?<OPTION VALUE="start-class">Wznów klasę</OPTION>:<OPTION VALUE="stop-class">Wstrzymaj klasę</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Akceptuj zadania</OPTION>:<OPTION VALUE="reject-jobs">Odrzucaj zadania</OPTION>}
+<OPTION VALUE="move-jobs">Przenieś wszystkie zadania</OPTION>
+<OPTION VALUE="purge-jobs">Anuluj wszystkie zadania</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Przejdź" 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="">Administracja</OPTION>
+<OPTION VALUE="modify-class">Zmodyfikuj klasę</OPTION>
+<OPTION VALUE="delete-class">Usuń klasę</OPTION>
+<OPTION VALUE="set-class-options">Ustaw domyślne opcje</OPTION>
+<OPTION VALUE="set-as-default">Ustaw jako domyślne serwera</OPTION>
+<OPTION VALUE="set-allowed-users">Ustaw zezwolonych użytkowników</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Przejdź" STYLE="display: none;">
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Opis:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Położenie:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Członkowie:</TH><TD>{?member_uris=?None:{member_uris}}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Domyślne:</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?Brak klas:Wyświetlanie {#printer_name} z {total} klas{total=1?:es}}.</P>
--- /dev/null
+{#printer_name=0?:
+<TABLE CLASS="list" SUMMARY="Lista klas">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&WHICH_JOBS={?WHICH_JOBS}&FIRST={FIRST}&ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>▲</SMALL> Nazwa kolejki <SMALL>▲</SMALL>:<SMALL>▼</SMALL> Nazwa kolejki <SMALL>▼</SMALL>}</A></TH><TH>Opis</TH><TH>Położenie</TH><TH>Members</TH><TH>Stan</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=?Brak:{member_uris}}</TD><TD>{printer_state=3?Idle:{printer_state=4?Przetwarzanie:Wstrzymane}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+}
+</TBODY>
+</TABLE></DIV>}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{title} On {printer_name}</H2>
+
+<P>{job_state>5?:<IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16"
+ALIGN="ABSMIDDLE" ALT="Busy Indicator"> }Printer command job
+{job_state=3?pending:{job_state=4?held:
+{job_state=5?processing:{job_state=6?stopped:
+{job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{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">Modyfikowanie pliku konfiguracji</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="Zapisz zmiany">
+<INPUT TYPE="BUTTON" VALUE="Użyj domyślnego pliku konfiguracji"
+onClick="reset_config();"></P>
+
+</FORM>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{?title} {?printer_name} Błąd</H2>
+
+<P>Błąd:</P>
+
+<BLOCKQUOTE>Nieznana operacja "{op}"!</BLOCKQUOTE>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{?title} {?printer_name} Błąd</H2>
+
+<P>{?message?{message}:Błąd:}</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="/"> Strona domowa </A></TD>
+<TD CLASS="{SECTION=admin?:un}sel"><A HREF="/admin"> Administracja </A></TD>
+<TD CLASS="{SECTION=classes?:un}sel"><A HREF="/classes/"> Klasy </A></TD>
+<TD CLASS="{SECTION=help?:un}sel"><A HREF="/help/"> Pomoc online </A></TD>
+<TD CLASS="{SECTION=jobs?:un}sel"><A HREF="/jobs/"> Zadania </A></TD>
+<TD CLASS="{SECTION=printers?:un}sel"><A HREF="/printers/"> Drukarki </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>Wyszukaj w
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie dokumenty}}:</B> <INPUT
+TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER=""
+AUTOSAVE="org.cups.help" RESULTS="20">
+<INPUT TYPE="SUBMIT" NAME="SEARCH" VALUE="Znajdź">
+<INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Wyczyść"></P>
+
+</FORM>
+
+<!-- Zakładki -->
+<DIV CLASS="sidebar"><TABLE CLASS="inset" SUMMARY="Zawartość">
+<TR><TD>
+
+<H3 CLASS="title">Dokumenty pomocy online</H3>
+
+<P CLASS="l0"><A HREF="/help/{QUERY??QUERY={QUERY}:}">Wszystkie dokumenty</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</TD></TR>
+</TABLE></DIV>
+
+{QUERY?<P>Wyniki wyszukiwania w {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie dokumenty}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Nie znaleziono.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}</H1>
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET"><INPUT TYPE="HIDDEN" NAME="PRINTABLE" VALUE="YES"><INPUT TYPE="SUBMIT" VALUE="Wyświetl wersję do druku"></FORM>:
+
+<H1>Pomoc online</H1>
+
+<P>To jest interfejs pomocy online CUPS. Należy podać wyszukiwane słowa
+powyżej lub nacisnąć na jeden z odnośników do dokumentacji, aby wyświetlić
+informacje o pomocy online.</P>
+
+<P>Nowi użytkownicy CUPS powinni przeczytać stronę "<a
+href="/help/overview.html">Przegląd CUPS</a>". Zaawansowani użytkownicy
+powinni przeczytać stronę "<a href="/help/whatsnew.html">Co nowego w CUPS
+1.4</a>".</P>
+
+<P><A HREF="http://www.cups.org/">Strona domowa CUPS</A> także
+dostarcza wiele zasobów, w tym fora dyskusyjne użytkowników, odpowiedzi
+na najczęściej zadawane pytania oraz formularz do wysyłania raportów
+błędów i próśb o nowe funkcje.</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">Anulowanie zadania {job_id}</H2>
+
+<P><A HREF="{job_printer_uri}">Zadanie {job_id}</A> zostało anulowane.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Wstrzymywanie zadania {job_id}</H2>
+
+<P><A HREF="{job_printer_uri}">Drukowanie zadania {job_id}</A> zostało wstrzymane.
+
+</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?Przenoszenie zadanie {job_id}:Przenoszenie wszystkich zadań}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nowe miejsce docelowe:</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?Przenieś zadanie:Przenieś zadania}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">{job_id?Przenoszenie zadania {job_id}:Przenoszenie wszystkich zadań}</H2>
+
+<P>{job_id?<A HREF="/jobs/{job_id}">Zadanie {job_id}</A>:Wszystkie zadania} zostało przeniesione do
+<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Zwalnianie zadania {job_id}</H2>
+
+<P><A HREF="{job_printer_uri}">Drukowanie zadania {job_id}</A> zostało zwolnione.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Ponowne drukowanie zadania {job_id}</H2>
+
+<P><A HREF="{job_printer_uri}">Zadanie {job_id}</A> zostało ponownie uruchomione.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">{?which_jobs=?:<FORM ACTION="{?printer_name=?/jobs:{printer_uri_supported}}" METHOD="GET"><INPUT TYPE="SUBMIT" VALUE="Wyświetl aktywne zadania"></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="Wyświetl zakończone zadania"></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="Wyświetl wszystkie zadania"></FORM>}</DIV>
+
+<P ALIGN="CENTER">{total=0?Brak zadań:Wyświetlanie {#job_id} z {total} {?which_jobs=?aktywnych:{which_jobs=wszystkich?:zakończonych}} zadań{total=1?:s}}.</P>
--- /dev/null
+{#job_id=0?:
+<TABLE CLASS="list" SUMMARY="Lista zadań">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&WHICH_JOBS={?WHICH_JOBS}&FIRST={FIRST}&ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>▲</SMALL> Identyfikator <SMALL>▲</SMALL>:<SMALL>▼</SMALL> Identyfikator <SMALL>▼</SMALL>}</A></TH><TH>Nazwa</TH><TH>Użytkownik</TH><TH>Rozmiar</TH><TH>Strony</TH><TH>Stan</TH><TH>Kontrola</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=?Unknown:{job_name}} </TD>
+<TD>{job_originating_user_name} </TD>
+<TD>{job_k_octets}k </TD>
+<TD>{job_media_sheets_completed=0?Unknown:{?job_media_sheets_completed}} </TD>
+<TD>{job_state=3?oczekiwanie od<BR>{time_at_creation}:{job_state=4?wstrzymane od<BR>{time_at_creation}:
+{job_state=5?przetwarzanie od<BR>{time_at_processing}:{job_state=6?zatrzymano:
+{job_state=7?anulowano o<BR>{time_at_completed}:{job_state=8?przerwano:zakończono o<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="Ponownie wydrukuj zadanie"></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="Zwolnij zadanie"></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="Wstrzymaj zadanie"></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="Anuluj zadanie"></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="Przenieś zadanie"></FORM>:}
+ </TD>
+</TR>
+}
+</TBODY>
+</TABLE>
+}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Dostępne drukarki</H2>
+
+{#device_uri=0?<P>Nie znaleziono drukarek.</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="Lokalna drukarka"><INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{device_make_and_model}"><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}"><INPUT TYPE="SUBMIT" VALUE="Dodaj tę drukarkę"></FORM>
+{device_make_and_model} ({device_info})</LI>
+}</UL>}
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Modyfikowanie klasy {printer_name}</H2>
+
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<TABLE>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Członkowie:</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="Zmodyfikuj klasę"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Modyfikowanie {printer_name}</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">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Połączenie:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">{device_uri}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Współdzielenie:</TH>
+<TD><INPUT TYPE="CHECKBOX" NAME="PRINTER_IS_SHARED" {PRINTER_IS_SHARED=1?CHECKED:}">
+Share This Printer</TD>
+</TR>
+<TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Kontynuuj"></TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Zmienianie ustawień</H2>
+
+<P>Serwer nie został ponownie uruchomiony, ponieważ nie wprowadzono żadnych zmian do
+konfiguracji...</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>Błąd:</B> następujące opcje są w konflikcie ze sobą:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Proszę zmienić jedną lub więcej opcji, aby rozwiązać konflikt.</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:}>Punkty</OPTION>
+<OPTION VALUE="mm"{paramvalue=mm? SELECTED:}>Milimetry</OPTION>
+<OPTION VALUE="cm"{paramvalue=cm? SELECTED:}>Centymetry</OPTION>
+<OPTION VALUE="in"{paramvalue=in? SELECTED:}>Cale</OPTION>
+<OPTION VALUE="ft"{paramvalue=ft? SELECTED:}>Stopy</OPTION>
+<OPTION VALUE="m"{paramvalue=m? SELECTED:}>Metry</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="Ustaw domyślne opcje"></P>
+
+</DIV>
--- /dev/null
+<TABLE CLASS="inset" SUMMARY="Pasek stron">
+<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="◀ Wyświetl poprzednie"></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="Wyświetl następne ▶"></FORM>: }</TD>
+</TR>
+</TABLE>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Akceptowanie zadań na {is_class?klasie:drukarce} {printer_name}</H2>
+
+<P>{is_class?Klasa:Drukarka} <A
+HREF="/{is_class?klasy:drukarki}/{printer_name}">{printer_name}</A>
+akceptują zadania.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Dodawanie drukarki</H2>
+
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została
+pomyślnie dodana.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Ustawianie domyślnych opcji dla {printer_name}</H2>
+
+<P>Domyślne opcje {OP=set-class-options?klasy <A HREF="/classes/{printer_name}">:drukarki <A HREF="/printers/{printer_name}">}{printer_name}</A>
+zostały pomyślnie ustawione.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Usuwanie drukarki {printer_name}</H2>
+
+<P><B>Ostrzeżenie:</B> usunąć drukarkę
+{printer_name}?</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="Usuń drukarkę"></FORM></P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Ustawianie {is_class?klasy:drukarki} {printer_name} jako domyślnej</H2>
+
+<P>{is_class?Klasa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została ustawiona jako domyślna drukarka serwera.</P>
+
+<BLOCKQUOTE><B>Uwaga:</B> każda domyśla opcja użytkownika ustawiona przez
+polecenie <TT>lpoptions</TT> zostanie zastąpiona tym domyślnym
+ustawieniem.</BLOCKQUOTE>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Usuwanie drukarki {printer_name}</H2>
+
+<P>Drukarka {printer_name} została pomyślnie usunięta.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+<H3 CLASS="title">Zadania</H3>
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Modyfikowanie drukarki {printer_name}</H2>
+
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została
+pomyślnie zmodyfikowana.
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Czyszczenie zadań na {is_class?klasie:drukarce} {printer_name}</H2>
+
+<P>{is_class?Klasa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została wyczyszczona ze wszystkich zadań.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Odrzucanie zadań na {is_class?klasie:drukarce} {printer_name}</H2>
+
+<P>{is_class?Klasa:Drukarka} <A
+HREF="/{is_class?Klasy:Drukarki}/{printer_name}">{printer_name}</A>
+nie akceptuje zadań.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Wznawianie {is_class?klasy:drukarki} {printer_name}</H2>
+
+<P>{is_class?Klasa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została wznowiona.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Wstrzymywanie {is_class?klasy:drukarki} {printer_name}</H2>
+
+<P>{is_class?Klasa:Drukarka} <A
+HREF="/{is_class?Klasy:Drukarki}/{printer_name}">{printer_name}</A>
+została wstrzymana.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>
+({printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymana}},
+{printer_is_accepting_jobs=0?Odrzucanie zadań:Akceptowanie zadań},
+{server_is_sharing_printers=0?Nie:{printer_is_shared=0?Nie:}} Współdzielona{default_name={printer_name}?, Domyślne serwera:})</H2>
+
+<FORM METHOD="POST" ACTION="{printer_uri_supported}" NAME="maintenance">
+<SELECT NAME="OP" ONCHANGE="document.maintenance.submit();">
+<OPTION VALUE="">Konserwacja</OPTION>
+<OPTION VALUE="print-test-page">Wydrukuj stronę próbną</OPTION>
+{printer_commands~.*Clean.*?<OPTION VALUE="clean-print-heads">Wyczyść głowice drukujące</OPTION>:}
+{printer_commands~.*PrintSelfTestPage.*?<OPTION VALUE="print-self-test-page">Wydrukuj własną stronę próbną</OPTION>:}
+{printer_state=5?<OPTION VALUE="start-printer">Wznów drukarkę</OPTION>:<OPTION VALUE="stop-printer">Wstrzymaj drukarkę</OPTION>}
+{printer_is_accepting_jobs=0?<OPTION VALUE="accept-jobs">Akceptuj zadania</OPTION>:<OPTION VALUE="reject-jobs">Odrzucaj zadania</OPTION>}
+<OPTION VALUE="move-jobs">Przenieś wszystkie zadania</OPTION>
+<OPTION VALUE="purge-jobs">Anuluj wszystkie zadania</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Przejdź" 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="">Administracja</OPTION>
+<OPTION VALUE="modify-printer">Zmodyfikuj drukarkę</OPTION>
+<OPTION VALUE="delete-printer">Usuń drukarkę</OPTION>
+<OPTION VALUE="set-printer-options">Ustaw domyślne opcje</OPTION>
+<OPTION VALUE="set-as-default">Ustaw jako domyślne serwera</OPTION>
+<OPTION VALUE="set-allowed-users">Ustaw zezwolonych użytkowników</OPTION>
+</SELECT>
+<INPUT TYPE="SUBMIT" VALUE="Przejdź" STYLE="display: none;">
+</FORM>
+
+<TABLE SUMMARY="{printer_name}">
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Opis:</TH><TD>{printer_info}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Położenie:</TH><TD>{printer_location}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Sterownik:</TH><TD>{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})<BR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Połączenie:</TH><TD>{device_uri}</TD></TR>
+<TR><TH ALIGN="RIGHT" VALIGN="TOP">Domyślne:</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?Brak drukarek:Wyświetlanie {#printer_name} z {total} drukarek{total=1?:s}}.</P>
--- /dev/null
+{#printer_name=0?:
+<TABLE CLASS="list" SUMMARY="Lista drukarek">
+<THEAD>
+<TR><TH><A HREF="{THISURL}?QUERY={?QUERY}&WHICH_JOBS={?WHICH_JOBS}&FIRST={FIRST}&ORDER={ORDER=dec?asc:dec}">{ORDER=dec?<SMALL>▲</SMALL> Nazwa kolejki <SMALL>▲</SMALL>:<SMALL>▼</SMALL> Nazwa kolejki <SMALL>▼</SMALL>}</A></TH><TH>Opis</TH><TH>Położenie</TH><TH>Producent i model</TH><TH>Stan</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?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymana}}{printer_state_message? - "{printer_state_message}":}</TD></TR>
+}
+</TBODY>
+</TABLE></DIV>}
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Zmienianie ustawień</H2>
+
+<P><IMG SRC="/images/wait.gif" WIDTH="16" HEIGHT="16" ALIGN="ABSMIDDLE"
+ALT="Wskaźnik zajętości"> Proszę czekać, trwa ponowne uruchamianie serwera...</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">Eksportowanie drukarek do Samby</H2>
+
+{error?<P>Nie można wyeksportować drukarek do Samby\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Proszę zobaczyć plik <A HREF="/admin/log/error_log"
+TARGET="_blank">error_log</A>, aby uzyskać więcej informacji.</P>:
+<P>Ta strona umożliwia wyeksportowanie drukarek do Samby, aby
+klienci Windows mogli mieć do nich dostęp przez ikonę <VAR>Otoczenie
+sieciowe</VAR> lub <VAR>Miejsca sieciowe</VAR> na pulpitach.
+Należy wcześniej zainstalować sterowniki drukarki Windows PostScript,
+tak jak opisano na stronie podręcznika <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A>.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Drukarki:</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()"> Wyeksportuj wszystkie drukarki
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Nazwa użytkownika Samby:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (wymagana)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Hasło Samby:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (wymagane)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="SUBMIT" VALUE="Wyeksportuj drukarki do Samby"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>Pomyślnie wyeksportowano drukarki do Samby.</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>Znajdź w
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?klasach:{SECTION=jobs?zadaniach:drukarkach}}}:</B>
+<INPUT TYPE="SEARCH" NAME="QUERY" VALUE="{?QUERY}" SIZE="40" PLACEHOLDER="" AUTOSAVE="org.cups.{SECTION}" RESULTS="20"> <INPUT
+TYPE="SUBMIT" VALUE="Znajdź"> <INPUT TYPE="SUBMIT" NAME="CLEAR" VALUE="Wyczyść"></P>
+
+</FORM>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Ustawianie domyślnych opcji dla {printer_name}</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="Zakolejkuj drukarkę do domyślnych opcji">:}
+
+<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"><!--
+// Ukryj własne parametry opcji dla przeglądarek rozumiejących 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>Subskrypcja {subscription_name} została pomyślnie dodana.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<P>Subskrypcja #{notify_subscription_id} została usunięta.</P>
+
+</DIV>
--- /dev/null
+<DIV CLASS="indent">
+
+<H2 CLASS="title">Drukowanie strony próbnej na {printer_name}</H2>
+
+<P>Wysłano stronę próbną; identyfikator zadania to <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
+
+</DIV>
--- /dev/null
+</TD></TR>
+<TR><TD> </TD></TR>
+<TR><TD CLASS="trailer">Wspólny uniksowy system drukowania, CUPS i logo CUPS
+są znakami handlowymi <A HREF="http://www.apple.com">Apple Inc.</A> CUPS
+copyright 2007-2009 Apple Inc. Wszystkie prawa zastrzeżone.</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">Zezwoleni użytkownicy dla {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Użytkownicy:</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:}>Pozwól tym użytkownikom drukować
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Nie pozwalaj tym użytkownikom drukować
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="SUBMIT" VALUE="Ustaw zezwolonych użytkowników">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
+</DIV>
#
# Test the lp command.
#
-# Copyright 2007-2008 by Apple Inc.
+# Copyright 2007-2009 by Apple Inc.
# Copyright 1997-2005 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
i=0
while test $i -lt $1; do
echo " flood copy $i..." 1>&2
+
+ j=1
+ while test $j -le $2; do
+ ../systemv/lp -d test-$j testfile.jpg 2>&1
+ j=`expr $j + 1`
+ done
+
../systemv/lp -d Test1 testfile.jpg 2>&1 &
../systemv/lp -d Test2 testfile.jpg 2>&1 &
lppid=$!
+
i=`expr $i + 1`
done
wait $lppid
#
# Test the lpr command.
#
-# Copyright 2007-2008 by Apple Inc.
+# Copyright 2007-2009 by Apple Inc.
# Copyright 1997-2005 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
i=0
while test $i -lt $1; do
echo " flood copy $i..." 1>&2
+
+ j=1
+ while test $j -le $2; do
+ ../berkeley/lpr -P test-$j testfile.jpg 2>&1
+ j=`expr $j + 1`
+ done
+
../berkeley/lpr -P Test1 testfile.jpg 2>&1 &
../berkeley/lpr -P Test2 testfile.jpg 2>&1 &
lprpid=$!
+
i=`expr $i + 1`
done
wait $lppid
nprinters1=0
nprinters2=0
pjobs=0
+ pprinters=0
;;
2)
echo "Running the medium tests (2)"
nprinters1=10
nprinters2=20
pjobs=20
+ pprinters=10
;;
3)
echo "Running the extreme tests (3)"
nprinters1=500
nprinters2=1000
pjobs=100
+ pprinters=50
;;
4)
echo "Running the torture tests (4)"
nprinters1=10000
nprinters2=20000
pjobs=200
+ pprinters=100
;;
*)
echo "Running the timid tests (1)"
nprinters1=0
nprinters2=0
pjobs=10
+ pprinters=0
;;
esac
ErrorLog /tmp/cups-$user/log/error_log
PageLog /tmp/cups-$user/log/page_log
LogLevel debug2
+LogTimeFormat usecs
PreserveJobHistory Yes
<Policy default>
<Limit All>
echo " $valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &"
echo ""
-$valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+if test `uname` = Darwin -a "x$valgrind" = x; then
+ DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib \
+ $valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+else
+ $valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &
+fi
+
cupsd=$!
if test "x$testtype" = x0; then
echo "" >>$strfile
echo "\"$file\":" >>$strfile
- sh $file $pjobs | tee -a $strfile
+ sh $file $pjobs $pprinters | tee -a $strfile
status=$?
if test $status != 0; then
#
# Script to wait for jobs to complete.
#
-# Copyright 2008 by Apple Inc.
+# Copyright 2008-2009 by Apple Inc.
#
# These coded instructions, statements, and computer programs are the
# property of Apple Inc. and are protected by Federal copyright
# file is missing or damaged, see the license at "http://www.cups.org/".
#
+#
# Get timeout from command-line
+#
+
if test $# = 1; then
timeout=$1
else
- timeout=60
+ timeout=360
+fi
+
+#
+# Figure out the proper echo options...
+#
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ ac_n=-n
+ ac_c=
+else
+ ac_n=
+ ac_c='\c'
fi
-echo "Waiting for jobs to complete..."
+echo $ac_n "Waiting for jobs to complete...$ac_c"
+oldjobs=0
while test $timeout -gt 0; do
- jobs=`../systemv/lpstat 2>/dev/null`
- if test "x$jobs" = "x"; then
+ jobs=`../systemv/lpstat 2>/dev/null | wc -l | tr -d ' '`
+ if test $jobs = 0; then
break
fi
+ if test $jobs != $oldjobs; then
+ echo $ac_n "$jobs...$ac_c"
+ oldjobs=$jobs
+ fi
+
sleep 5
timeout=`expr $timeout - 5`
done
+echo ""
+
#
# End of "$Id$".
#