diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/wprclean2.c |
Initial commit
Diffstat (limited to 'support/dktools/wprclean2.c')
-rw-r--r-- | support/dktools/wprclean2.c | 1178 |
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; +} + |