summaryrefslogtreecommitdiff
path: root/support/dktools/wprclean2.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/wprclean2.c
Initial commit
Diffstat (limited to 'support/dktools/wprclean2.c')
-rw-r--r--support/dktools/wprclean2.c1178
1 files changed, 1178 insertions, 0 deletions
diff --git a/support/dktools/wprclean2.c b/support/dktools/wprclean2.c
new file mode 100644
index 0000000000..477d24bff0
--- /dev/null
+++ b/support/dktools/wprclean2.c
@@ -0,0 +1,1178 @@
+/*
+ WARNING: This file was generated by dkct.
+ Changes you make here will be lost if dkct is run again!
+ You should modify the original source and run dkct on it.
+ Original source: wprclean2.ctr
+*/
+
+
+#line 5 "wprclean2.ctr"
+
+/** @file wprclean.c Cleanup Windows print queues.
+*/
+
+#include "dk4conf.h"
+
+#include <stdio.h>
+
+#if DK4_ON_WINDOWS
+#ifndef WINDOWS_H_INCLUDED
+#include <windows.h>
+#define WINDOWS_H_INCLUDED
+#endif
+#endif
+
+#if DK4_HAVE_STDLIB_H
+#ifndef STDLIB_H_INCLUDED
+#include <stdlib.h>
+#define STDLIB_H_INCLUDED 1
+#endif
+#endif
+
+#if DK4_HAVE_UNISTD_H
+#ifndef UNISTD_H_INCLUDED
+#include <unistd.h>
+#define UNISTD_H_INCLUDED 1
+#endif
+#endif
+
+#if DK4_HAVE_PROCESS_H
+#ifndef PROCESS_H_INCLUDED
+#include <process.h>
+#define PROCESS_H_INCLUDED 1
+#endif
+#endif
+
+#if DK4_HAVE_IO_H
+#ifndef IO_H_INCLUDED
+#include <io.h>
+#define IO_H_INCLUDED 1
+#endif
+#endif
+
+#if DK4_HAVE_FCNTL_H
+#ifndef FCNTL_H_INCLUDED
+#include <fcntl.h>
+#define FCNTL_H_INCLUDED 1
+#endif
+#endif
+
+#if DK4_HAVE_SYS_TYPES_H
+#ifndef SYS_TYPES_H_INCLUDED
+#include <sys/types.h>
+#define SYS_TYPES_H_INCLUDED 1
+#endif
+#endif
+
+#if DK4_HAVE_SIGNAL_H
+#ifndef SIGNAL_H_INCLUDED
+#include <signal.h>
+#define SIGNAL_H_INCLUDED 1
+#endif
+#endif
+
+#include "dk4types.h"
+#include "dk4const.h"
+#include "dk4error.h"
+#include "dk4mem.h"
+#include "dk4mema.h"
+#include "dk4strd.h"
+#include "dk4app.h"
+#include "dk4aopt.h"
+#include "dk4vers.h"
+#include "dk4hnamed.h"
+#include "dk4user.h"
+
+
+
+
+
+#line 84 "wprclean2.ctr"
+
+
+
+/** Information required to delete a print job.
+*/
+typedef struct {
+ DWORD position; /**< Position in queue. */
+ DWORD jobid; /**< Job ID. */
+} wprclean_printjob_t;
+
+
+
+/** Constant text strings used by program, not localized.
+*/
+static const dkChar * const wprclean_kwnl[] = {
+/* 0 */
+dkT("dktools"),
+
+/* 1 */
+dkT("wprclean.txt"),
+
+/* 2 */
+dkT("wprclean.str"),
+
+NULL
+
+
+#line 113 "wprclean2.ctr"
+};
+
+
+
+/** Constant texts used by the program, replaced by localized versions.
+*/
+static const dkChar * const wprclean_kw_def[] = {
+/* 0 */
+dkT("This program is only available for the Windows platform!"),
+
+/* 1 */
+dkT("Unnamed printer found in enumeration!"),
+
+/* 2 */
+dkT("Failed to enumerate print queues!"),
+
+/* 3 */
+dkT("Failed to open print queue \""),
+
+/* 4 */
+dkT("\"!"),
+
+/* 5 */
+dkT("Failed to obtain size for print queue information \""),
+
+/* 6 */
+dkT("\"!"),
+
+/* 7 */
+dkT("Failed to enumerate jobs for print queue \""),
+
+/* 8 */
+dkT("\"!"),
+
+/* 9 */
+dkT("Failed to obtain number of jobs for queue \""),
+
+/* 10 */
+dkT("\"!"),
+
+/* 11 */
+dkT("Failed to remove job from queue \""),
+
+/* 12 */
+dkT("\"!"),
+
+NULL
+
+
+#line 159 "wprclean2.ctr"
+};
+
+
+
+static const dkChar * const wprclean_help_text[] = {
+/* 0 */
+dkT(""),
+
+/* 1 */
+dkT("Windows print queue cleanup"),
+
+/* 2 */
+dkT(""),
+
+/* 3 */
+dkT("wprclean [-c]"),
+
+/* 4 */
+dkT(""),
+
+/* 5 */
+dkT("Options:"),
+
+/* 6 */
+dkT("-c\t--computer\tDelete print jobs submitted from this computer only."),
+
+/* 7 */
+dkT(""),
+
+/* 8 */
+dkT("\t--help\t\tShow this short help text."),
+
+/* 9 */
+dkT("\t--manual\t*** SHOW FULL MANUAL ***"),
+
+/* 10 */
+dkT("\t--version\tShow version information."),
+
+/* 11 */
+dkT("\t--license\tShow license information."),
+
+NULL
+
+
+#line 178 "wprclean2.ctr"
+};
+
+
+
+
+/** License conditions.
+*/
+static const dkChar * const wprclean_license_text[] = {
+dkT(""),
+dkT("This software uses code from the following projects, either directly or as"),
+dkT("a library:"),
+dkT(""),
+dkT("dktools\t\tDirk Krause's tools and libraries."),
+dkT("\t\tSee http://dktools.sourceforge.net/ for more information."),
+#if DK4_HAVE_ZLIB_H
+dkT(""),
+dkT("zlib\t\tData compression library."),
+dkT("\t\tSee http://www.zlib.net/ for more information."),
+#endif
+#if DK4_HAVE_BZLIB_H
+dkT(""),
+dkT("bzip2\t\tData compression program and library."),
+dkT("\t\tSee http://www.bzip.org/ for more information."),
+#endif
+dkT(""),
+dkT("All the licenses below apply to the program."),
+dkT("Licenses for used libraries are shown as found on my Scientific Linux 6.x"),
+dkT("computer in the /usr/share/doc directory on 2015-04-01. Check the project"),
+dkT("homepages of the used libraries for additional information and/or updated"),
+dkT("license terms."),
+dkT(""),
+dkT(""),
+dkT("DK tools and libraries license"),
+dkT("=============================="),
+dkT("Copyright (c) 2015-2016, Dirk Krause"),
+dkT("All rights reserved."),
+dkT(""),
+dkT("Redistribution and use in source and binary forms, with or without"),
+dkT("modification, are permitted provided that the following conditions are met:"),
+dkT(""),
+dkT("* Redistributions of source code must retain the above copyright notice,"),
+dkT(" this list of conditions and the following disclaimer."),
+dkT("* Redistributions in binary form must reproduce the above copyright"),
+dkT(" notice, this list of conditions and the following disclaimer in the"),
+dkT(" documentation and/or other materials provided with the distribution."),
+dkT("* Neither the name of the Dirk Krause nor the names of contributors may be"),
+dkT(" used to endorse or promote products derived from this software without"),
+dkT(" specific prior written permission."),
+dkT(""),
+dkT("THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\""),
+dkT("AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"),
+dkT("IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"),
+dkT("ARE DISCLAIMED."),
+dkT(""),
+dkT("IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,"),
+dkT("INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,"),
+dkT("BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,"),
+dkT("DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY"),
+dkT("OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING"),
+dkT("NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,"),
+dkT("EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."),
+#if DK4_HAVE_ZLIB_H
+dkT(""),
+dkT(""),
+dkT("Zlib license"),
+dkT("============"),
+dkT("(C) 1995-2004 Jean-loup Gailly and Mark Adler"),
+dkT(""),
+dkT("This software is provided 'as-is', without any express or implied"),
+dkT("warranty. In no event will the authors be held liable for any damages"),
+dkT("arising from the use of this software."),
+dkT(""),
+dkT("Permission is granted to anyone to use this software for any purpose,"),
+dkT("including commercial applications, and to alter it and redistribute it"),
+dkT("freely, subject to the following restrictions:"),
+dkT(""),
+dkT("1. The origin of this software must not be misrepresented; you must not"),
+dkT(" claim that you wrote the original software. If you use this software"),
+dkT(" in a product, an acknowledgment in the product documentation would be"),
+dkT(" appreciated but is not required."),
+dkT("2. Altered source versions must be plainly marked as such, and must not be"),
+dkT(" misrepresented as being the original software."),
+dkT("3. This notice may not be removed or altered from any source distribution."),
+dkT(""),
+dkT("Jean-loup Gailly Mark Adler"),
+dkT("jloup@gzip.org madler@alumni.caltech.edu"),
+#endif
+#if DK4_HAVE_BZLIB_H
+dkT(""),
+dkT(""),
+dkT("Bzip2 and libbzip2 library license"),
+dkT("=================================="),
+dkT("This program, \"bzip2\", the associated library \"libbzip2\", and all"),
+dkT("documentation, are copyright (C) 1996-2007 Julian R Seward. All"),
+dkT("rights reserved."),
+dkT(""),
+dkT("Redistribution and use in source and binary forms, with or without"),
+dkT("modification, are permitted provided that the following conditions"),
+dkT("are met:"),
+dkT(""),
+dkT("1. Redistributions of source code must retain the above copyright"),
+dkT(" notice, this list of conditions and the following disclaimer."),
+dkT(""),
+dkT("2. The origin of this software must not be misrepresented; you must "),
+dkT(" not claim that you wrote the original software. If you use this "),
+dkT(" software in a product, an acknowledgment in the product "),
+dkT(" documentation would be appreciated but is not required."),
+dkT(""),
+dkT("3. Altered source versions must be plainly marked as such, and must"),
+dkT(" not be misrepresented as being the original software."),
+dkT(""),
+dkT("4. The name of the author may not be used to endorse or promote "),
+dkT(" products derived from this software without specific prior written "),
+dkT(" permission."),
+dkT(""),
+dkT("THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS"),
+dkT("OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED"),
+dkT("WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"),
+dkT("ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY"),
+dkT("DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"),
+dkT("DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE"),
+dkT("GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS"),
+dkT("INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,"),
+dkT("WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING"),
+dkT("NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS"),
+dkT("SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."),
+dkT(""),
+dkT("Julian Seward, jseward@bzip.org"),
+dkT("bzip2/libbzip2 version 1.0.5 of 10 December 2007"),
+#endif
+dkT(""),
+NULL
+
+
+#line 311 "wprclean2.ctr"
+};
+
+
+
+/** Full computer name (including domain).
+*/
+static dkChar host_long[256];
+
+
+
+/** Short computer name (just host name).
+*/
+static dkChar host_short[256];
+
+
+
+/** User name.
+*/
+static dkChar user_name[256];
+
+
+
+/** Options used by the program.
+*/
+static const dk4_option_specification_t wprclean_options[] = {
+
+ /* Delete jobs submitted from local computer only.
+ */
+ { dkT('c'), dkT("computer"), DK4_OPT_ARG_NONE },
+
+ /* Produce verbose output.
+ */
+ { dkT('v'), dkT("verbose"), DK4_OPT_ARG_NONE }
+};
+
+
+
+/** Application structure.
+*/
+static dk4_app_t *app = NULL;
+
+
+
+/** Queue storage.
+*/
+static dk4_sto_t *s_q = NULL;
+
+
+
+/** Iterator for queue storage.
+*/
+static dk4_sto_it_t *i_q = NULL;
+
+
+
+/** Message texts, replaced by localized version if available.
+*/
+static const dkChar * const *msg = wprclean_kw_def;
+
+
+/** Number of elements in the wprclean_options array.
+*/
+static const size_t wprclean_sz_options =
+sizeof(wprclean_options)/sizeof(dk4_option_specification_t);
+
+
+
+/** Size of user_name buffer.
+*/
+static const size_t sz_user_name = DK4_SIZEOF(user_name,dkChar);
+
+
+
+/** Number of elements in the wprclean_kw_def array.
+*/
+static size_t sz_msg =
+(sizeof(wprclean_kw_def)/sizeof(DK4_PDKCHAR) - 1);
+
+
+
+/** Size of short host name buffer.
+*/
+static const size_t sz_host_short = DK4_SIZEOF(host_short,dkChar);
+
+
+
+/** Flag: Use separated short host name.
+*/
+static int have_short_host = 0;
+
+
+
+/** Flag: Delete jobs submitted from current host only.
+*/
+static int only_this_host = 0;
+
+
+
+/** Exit status code returned by the program.
+*/
+static int exval = EXIT_FAILURE;
+
+
+
+/** Flag: Verbose output.
+*/
+static int verbose = 0;
+
+
+
+/* This program is only available for the Windows platform!
+*/
+#if DK4_ON_WINDOWS
+
+
+
+/** Check presence of -c option, retrieve host name and short
+ host name if necessary.
+*/
+static
+void
+check_options(void)
+{
+ dkChar *ptr;
+
+
+#line 436 "wprclean2.ctr"
+ host_long[0] = dkT('\0');
+ host_short[0] = dkT('\0');
+ user_name[0] = dkT('\0');
+ if (0 != dk4app_opt_is_set_short(app, dkT('v'), NULL)) {
+ verbose = 1;
+
+#line 441 "wprclean2.ctr"
+ }
+ if (0 != dk4app_opt_is_set_short(app, dkT('c'), NULL)) {
+
+#line 443 "wprclean2.ctr"
+ if (0 != dk4hostname(host_long, DK4_SIZEOF(host_long,dkChar), NULL)) {
+ only_this_host = 1;
+
+#line 445 "wprclean2.ctr"
+ if (0 != dk4str_cpy_s(host_short, sz_host_short, host_long, NULL)) {
+ ptr = dk4str_chr(host_short, dkT('.'));
+
+#line 447 "wprclean2.ctr"
+ if (NULL != ptr) {
+
+#line 448 "wprclean2.ctr"
+ *ptr = dkT('\0');
+ have_short_host = 1;
+ }
+#if TRACE_DEBUG
+ else {
+
+#line 453 "wprclean2.ctr"
+ }
+#endif
+ }
+#if TRACE_DEBUG
+ else {
+
+#line 458 "wprclean2.ctr"
+ }
+#endif
+ }
+#if TRACE_DEBUG
+ else {
+
+#line 463 "wprclean2.ctr"
+ }
+#endif
+ }
+
+
+#line 467 "wprclean2.ctr"
+}
+
+
+
+/** Compare two queue names.
+ @param l Left queue name.
+ @param r Right queue name.
+ @param cr Comparison criteria, unused.
+ @return Comparison result.
+*/
+static
+int
+compare_queues(const void *l, const void *r, int cr)
+{
+ int back = 0;
+ if (NULL != l) {
+ if (NULL != r) {
+ back = dk4str_cmp((const dkChar *)l, (const dkChar *)r);
+ if (-1 > back) back = -1;
+ if ( 1 < back) back = 1;
+ } else back = 1;
+ } else {
+ if (NULL != r) back = -1;
+ }
+ return back;
+}
+
+
+
+/** Compare two print jobs within the same queue.
+ @param l Left job.
+ @param r Right job.
+ @param cr Comparison criteria (ignored).
+ @return Comparison result (inverted sort order).
+*/
+static
+int
+compare_print_jobs(const void *l, const void *r, int cr)
+{
+ const wprclean_printjob_t *jl = NULL;
+ const wprclean_printjob_t *jr = NULL;
+ int back = 0;
+ if (NULL != l) {
+ if (NULL != r) {
+ jl = (const wprclean_printjob_t *)l;
+ jr = (const wprclean_printjob_t *)r;
+ if (jl->position > jr->position) {
+ back = -1;
+ } else {
+ if (jr->position > jl->position) {
+ back = 1;
+ } else {
+ if (jl->jobid > jr->jobid) {
+ back = -1;
+ } else {
+ if (jr->jobid > jl->jobid) {
+ back = 1;
+ }
+ }
+ }
+ }
+ } else back = 1;
+ } else {
+ if (NULL != r) back = -1;
+ }
+ return back;
+}
+
+
+/** Allocate resources for list of print queues and iterator.
+ @return 1 on success, 0 on error.
+*/
+static
+int
+setup_for_queue_list(void)
+{
+ int back = 0;
+
+
+#line 545 "wprclean2.ctr"
+ s_q = dk4sto_open(NULL);
+ if (NULL != s_q) {
+
+#line 547 "wprclean2.ctr"
+ dk4sto_set_comp(s_q, compare_queues, 0);
+ i_q = dk4sto_it_open(s_q, NULL);
+ if (NULL != i_q) {
+
+#line 550 "wprclean2.ctr"
+ back = 1;
+ }
+#if TRACE_DEBUG
+ else {
+
+#line 554 "wprclean2.ctr"
+ }
+#endif
+ }
+#if TRACE_DEBUG
+ else {
+
+#line 559 "wprclean2.ctr"
+ }
+#endif
+
+
+#line 562 "wprclean2.ctr"
+ return back;
+}
+
+
+
+/** Clean up print queues storage and iterator.
+*/
+static
+void
+cleanup_for_queue_list(void)
+{
+ dkChar *p;
+
+
+#line 575 "wprclean2.ctr"
+ /* Release all queue names saved, close iterator.
+ */
+ if (NULL != i_q) {
+
+#line 578 "wprclean2.ctr"
+ dk4sto_it_reset(i_q);
+ do {
+ p = (dkChar *)dk4sto_it_next(i_q);
+ if (NULL != p) {
+ dk4mem_free(p);
+ }
+ } while (NULL != p);
+
+#line 585 "wprclean2.ctr"
+ dk4sto_it_close(i_q); i_q = NULL;
+ }
+ /* Close storage.
+ */
+ if (NULL != s_q) {
+
+#line 590 "wprclean2.ctr"
+ dk4sto_close(s_q); s_q = NULL;
+ }
+
+
+#line 593 "wprclean2.ctr"
+}
+
+
+
+/** Retrieve list of print queue names.
+ @return 1 on success, 0 on error
+*/
+static
+int
+retrieve_queue_list(void)
+{
+#if DK4_ON_WINDOWS
+ char *peb; /* Result buffer */
+ dkChar *pn; /* Printer name */
+#if DK4_CHAR_SIZE > 1
+ PRINTER_INFO_2W *pi2; /* Printer information array */
+#else
+ PRINTER_INFO_2A *pi2; /* Printer information array */
+#endif
+ DWORD cbNeeded; /* Bytes needed */
+ DWORD cbReturned; /* Bytes returned */
+ DWORD szPeb; /* Size of peb */
+ DWORD i; /* Index current print queue */
+ BOOL res; /* Operation result */
+ int back = 0;
+
+
+#line 619 "wprclean2.ctr"
+ cbNeeded = cbReturned = szPeb = (DWORD)0UL;
+#if DK4_CHAR_SIZE > 1
+ EnumPrintersW(PRINTER_ENUM_LOCAL,NULL,2,NULL,szPeb,&cbNeeded,&cbReturned);
+#else
+ EnumPrintersA(PRINTER_ENUM_LOCAL,NULL,2,NULL,szPeb,&cbNeeded,&cbReturned);
+#endif
+ if ((DWORD)0UL < cbNeeded) {
+ szPeb = cbNeeded;
+ peb = dk4mem_new_app(char, (size_t)cbNeeded, app);
+ if (NULL != peb) {
+ cbNeeded = cbReturned = (DWORD)0UL;
+#if DK4_CHAR_SIZE > 1
+ res = EnumPrintersW(
+ PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)peb,szPeb,&cbNeeded,&cbReturned
+ );
+#else
+ res = EnumPrintersA(
+ PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)peb,szPeb,&cbNeeded,&cbReturned
+ );
+#endif
+ if (res) {
+ if ((DWORD)0UL < cbReturned) {
+ pi2 = (PRINTER_INFO_2 *)peb;
+ back = 1;
+ for (i = (DWORD)0UL; i < cbReturned; i++) {
+ if (NULL != pi2->pPrinterName) {
+ pn = dk4str_dup(pi2->pPrinterName, NULL);
+ if (NULL != pn) {
+ if (0 == dk4sto_add(s_q, pn, NULL)) {
+ dk4mem_free(pn);
+
+#line 649 "wprclean2.ctr"
+ back = 0;
+ exval = EXIT_FAILURE;
+ /* ERROR: Memory */
+ dk4app_log_base1(app, DK4_LL_ERROR, 90);
+ }
+ } else {
+
+#line 655 "wprclean2.ctr"
+ back = 0;
+ exval = EXIT_FAILURE;
+ /* ERROR: Memory */
+ dk4app_log_base1(app, DK4_LL_ERROR, 90);
+ }
+ } else {
+
+#line 661 "wprclean2.ctr"
+ back = 0;
+ exval = EXIT_FAILURE;
+ /* ERROR: Invalid printer configuration */
+ dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 1);
+ }
+ pi2++;
+ }
+ } else {
+
+#line 669 "wprclean2.ctr"
+ }
+ } else {
+
+#line 671 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Printer enumeration failed */
+ dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 2);
+ }
+ dk4mem_release(peb);
+ } else {
+
+#line 677 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ }
+ } else {
+
+#line 680 "wprclean2.ctr"
+ }
+
+
+#line 682 "wprclean2.ctr"
+ return back;
+#else
+ return 1;
+#endif
+}
+
+
+
+/** Remove jobs from one print queue.
+*/
+static
+void
+handle_one_queue(const dkChar *pn)
+{
+ char *pc1 = NULL; /* First buffer */
+ char *pc2 = NULL; /* Second buffer */
+ dk4_sto_t *s_j = NULL; /* Jobs container */
+ dk4_sto_it_t *i_j = NULL; /* Jobs iterator */
+#if DK4_CHAR_SIZE > 1
+ PRINTER_INFO_2W *pi2 = NULL; /* Printer info */
+ JOB_INFO_1W *ji1 = NULL; /* Print job info */
+#else
+ PRINTER_INFO_2A *pi2 = NULL; /* Printer info */
+ JOB_INFO_1A *ji1 = NULL; /* Print job info */
+#endif
+ wprclean_printjob_t *pj = NULL; /* New print job */
+ HANDLE h_pr = INVALID_HANDLE_VALUE; /* Printer handle */
+ DWORD sz1 = (DWORD)0UL; /* Size provided */
+ DWORD sz2 = (DWORD)0UL; /* Size needed */
+ DWORD sz3 = (DWORD)0UL; /* Size provided */
+ DWORD sz4 = (DWORD)0UL; /* Size needed */
+ DWORD sz5 = (DWORD)0UL; /* No print jobs */
+ DWORD nJobs = (DWORD)0UL; /* Number of jobs */
+ DWORD i = (DWORD)0UL; /* Current job index */
+ int mm = 0; /* Machine matches */
+ int um = 0; /* User matches */
+ BOOL bres = FALSE; /* Printer open res */
+ BOOL br1 = FALSE; /* GetPrinter res */
+ BOOL br2 = FALSE; /* GetPrinter res */
+ BOOL br3 = FALSE; /* EnumJobs res */
+ BOOL br4 = FALSE; /* EnumJobs res */
+ BOOL br5 = FALSE; /* SetJob res */
+
+
+#line 725 "wprclean2.ctr"
+ /* Prepare data structures.
+ */
+ s_j = dk4sto_open(NULL);
+ if (NULL == s_j) {
+
+#line 729 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Memory */
+ dk4app_log_base1(app, DK4_LL_ERROR, 90);
+ goto finished;
+ }
+ dk4sto_set_comp(s_j, compare_print_jobs, 0);
+ i_j = dk4sto_it_open(s_j, NULL);
+ if (NULL == i_j) {
+
+#line 737 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Memory */
+ dk4app_log_base1(app, DK4_LL_ERROR, 90);
+ goto finished;
+ }
+ /* Open printer
+ */
+#if DK4_CHAR_SIZE > 1
+ bres = OpenPrinterW(pn, &h_pr, NULL);
+#else
+ bres = OpenPrinterA(pn, &h_pr, NULL);
+#endif
+ if (!(bres)) {
+
+#line 750 "wprclean2.ctr"
+ h_pr = INVALID_HANDLE_VALUE;
+ exval = EXIT_FAILURE;
+ /* ERROR: Failed to open printer */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 3, 4, pn);
+ goto finished;
+ }
+ /* Retrieve number of jobs
+ */
+#if DK4_CHAR_SIZE > 1
+ br1 = GetPrinterW(h_pr, 2, NULL, (DWORD)0UL, &sz1);
+#else
+ br1 = GetPrinterA(h_pr, 2, NULL, (DWORD)0UL, &sz1);
+#endif
+ if ((DWORD)0UL == sz1) {
+
+#line 764 "wprclean2.ctr"
+
+
+#line 765 "wprclean2.ctr"
+
+
+#line 766 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Failed to request print queue */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 5, 6, pn);
+ goto finished;
+ }
+ if ((DWORD)0UL == sz1) {
+
+#line 772 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Failed to request print queue */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 5, 6, pn);
+ goto finished;
+ }
+ pc1 = dk4mem_new_app(char,(size_t)sz1,app);
+ if (NULL == pc1) {
+
+#line 779 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ goto finished;
+ }
+#if DK4_CHAR_SIZE > 1
+ br2 = GetPrinterW(h_pr, 2, pc1, sz1, &sz2);
+#else
+ br2 = GetPrinterA(h_pr, 2, pc1, sz1, &sz2);
+#endif
+ if (!(br2)) {
+
+#line 788 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: GetPrinter failed */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 9, 10, pn);
+ goto finished;
+ }
+ if (sz2 > sz1) {
+
+#line 794 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Number of bytes increased. */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 9, 10, pn);
+ goto finished;
+ }
+ pi2 = (PRINTER_INFO_2 *)pc1;
+ nJobs = pi2->cJobs;
+ if ((DWORD)0UL == nJobs) {
+
+#line 802 "wprclean2.ctr"
+ goto finished;
+ }
+ /* Retrieve job data and build sorted storage
+ */
+#if DK4_CHAR_SIZE > 1
+ br3 = EnumJobsW(
+ h_pr, (DWORD)0UL, nJobs, 1, NULL, (DWORD)0UL, &sz3, &sz4
+ );
+#else
+ br3 = EnumJobsW(
+ h_pr, (DWORD)0UL, nJobs, 1, NULL, (DWORD)0UL, &sz3, &sz4
+ );
+#endif
+ if ((!(br3)) || ((DWORD)0UL == sz3)) {
+
+#line 816 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Failed to find required byte number */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 7, 8, pn);
+ goto finished;
+ }
+ pc2 = dk4mem_new_app(char,(size_t)sz3,app);
+ if (NULL == pc2) {
+
+#line 823 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ goto finished;
+ }
+ sz4 = (DWORD)0UL;
+#if DK4_CHAR_SIZE > 1
+ br4 = EnumJobsW(
+ h_pr, (DWORD)0UL, nJobs, 1, pc2, sz3, &sz4, &sz5
+ );
+#else
+ br4 = EnumJobsW(
+ h_pr, (DWORD)0UL, nJobs, 1, pc2, sz3, &sz4, &sz5
+ );
+#endif
+ if (!(br4)) {
+
+#line 837 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: EnumJobs */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 7, 8, pn);
+ goto finished;
+ }
+ if (sz4 > sz3) {
+
+#line 843 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Number of bytes changed */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 7, 8, pn);
+ goto finished;
+ }
+#if DK4_CHAR_SIZE > 1
+ ji1 = (JOB_INFO_1W *)pc2;
+#else
+ ji1 = (JOB_INFO_1A *)pc2;
+#endif
+ for (i = (DWORD)0UL; i < sz5; i++) {
+ mm = 1;
+ um = 1;
+ if (0 != only_this_host) {
+
+#line 857 "wprclean2.ctr"
+ if (NULL != ji1->pMachineName) {
+
+#line 858 "wprclean2.ctr"
+ if (0 != dk4str_casecmp(host_long, ji1->pMachineName)) {
+ mm = 0;
+ if (0 != have_short_host) {
+
+#line 861 "wprclean2.ctr"
+ if (0 == dk4str_casecmp(host_short, ji1->pMachineName)) {
+ mm = 1;
+
+#line 863 "wprclean2.ctr"
+ }
+ }
+ }
+ }
+ }
+ if (NULL != ji1->pUserName) {
+ if (0 != dk4str_casecmp(user_name, ji1->pUserName)) {
+ um = 0;
+ }
+ }
+ else {
+
+#line 874 "wprclean2.ctr"
+ um = 0;
+ }
+ if ((0 != mm) && (0 != um)) {
+
+#line 877 "wprclean2.ctr"
+ pj = dk4mem_new_app(wprclean_printjob_t,1,app);
+ if (NULL != pj) {
+ pj->position = i;
+ pj->jobid = ji1->JobId;
+
+
+#line 882 "wprclean2.ctr"
+ if (0 == dk4sto_add(s_j, pj, NULL)) {
+
+#line 883 "wprclean2.ctr"
+ dk4mem_free(pj);
+ exval = EXIT_FAILURE;
+ /* ERROR: Memory */
+ dk4app_log_base1(app, DK4_LL_ERROR, 90);
+ }
+ } else {
+
+#line 889 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ }
+ }
+ ji1++;
+ }
+ /* Remove print jobs from queue
+ */
+ dk4sto_it_reset(i_j);
+ do {
+ pj = (wprclean_printjob_t *)dk4sto_it_next(i_j);
+ if (NULL != pj) {
+
+#line 900 "wprclean2.ctr"
+#if DK4_CHAR_SIZE > 1
+ br5 = SetJobW(h_pr, pj->jobid, 0, NULL, JOB_CONTROL_DELETE);
+#else
+ br5 = SetJobA(h_pr, pj->jobid, 0, NULL, JOB_CONTROL_DELETE);
+#endif
+ if (!(br5)) {
+
+#line 906 "wprclean2.ctr"
+ exval = EXIT_FAILURE;
+ /* ERROR: Failed to remove job */
+ dk4app_log_3(app, msg, sz_msg, DK4_LL_ERROR, 11, 12, pn);
+ }
+ else {
+
+#line 911 "wprclean2.ctr"
+ }
+ }
+ } while(NULL != pj);
+
+ /* Final cleanup.
+ */
+ finished:
+ if (NULL != pc2) {
+ dk4mem_free(pc2);
+ }
+ if (NULL != pc1) {
+ dk4mem_free(pc1);
+ }
+ if (bres) {
+ ClosePrinter(h_pr);
+ }
+ if (NULL != i_j) {
+ dk4sto_it_reset(i_j);
+ do {
+ pj = (wprclean_printjob_t *)dk4sto_it_next(i_j);
+ if (NULL != pj) {
+ dk4mem_free(pj);
+ }
+ } while(NULL != pj);
+ dk4sto_it_close(i_j);
+ }
+ if (NULL != s_j) {
+ dk4sto_close(s_j);
+ }
+
+
+#line 941 "wprclean2.ctr"
+}
+
+
+
+/** Remove all print jobs from local queues.
+*/
+static
+void
+remove_all_print_jobs(void)
+{
+ dkChar *pn;
+
+ check_options();
+ if (0 != dk4user_get_logname(user_name, sz_user_name, 1, NULL)) {
+ if (setup_for_queue_list()) {
+ exval = EXIT_SUCCESS;
+ if (retrieve_queue_list()) {
+ dk4sto_it_reset(i_q);
+ do {
+ pn = (dkChar *)dk4sto_it_next(i_q);
+ if (NULL != pn) {
+ handle_one_queue(pn);
+ }
+ } while (NULL != pn);
+ }
+ }
+ cleanup_for_queue_list();
+ } else {
+ }
+}
+
+#endif
+
+
+
+/** Main function.
+ @param argc Number of command line arguments.
+ @param argv Command line arguments array.
+ @return 0 on success, all other values indicate errors.
+*/
+#if DK4_CHAR_SIZE > 1
+int wmain(int argc, wchar_t *argv[])
+#else
+int main(int argc, char *argv[])
+#endif
+{
+
+
+#line 988 "wprclean2.ctr"
+
+
+#line 989 "wprclean2.ctr"
+ app = dk4app_open_cmd(
+ argc, argv, wprclean_options, wprclean_sz_options,
+ wprclean_kwnl[0], DKT_VERSION_DK,
+ wprclean_kwnl[1], wprclean_help_text, wprclean_license_text
+ );
+ if (NULL != app) {
+ sz_msg = dk4app_string_table_size(wprclean_kw_def);
+ msg = dk4app_string_table(app, wprclean_kwnl[2], wprclean_kw_def);
+ if (0 != dk4app_can_run_normally(app)) {
+#if DK4_ON_WINDOWS
+ remove_all_print_jobs();
+#else
+ dk4app_log_1(app, msg, sz_msg, DK4_LL_ERROR, 0);
+#endif
+ } else {
+ if (0 != dk4app_help_version_license(app)) {
+ exval = EXIT_SUCCESS;
+ }
+ }
+ dk4app_close(app);
+ }
+
+
+#line 1011 "wprclean2.ctr"
+
+
+#line 1012 "wprclean2.ctr"
+ exit(exval); return exval;
+}
+