/* 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 #if DK4_ON_WINDOWS #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED #endif #endif #if DK4_HAVE_STDLIB_H #ifndef STDLIB_H_INCLUDED #include #define STDLIB_H_INCLUDED 1 #endif #endif #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_PROCESS_H #ifndef PROCESS_H_INCLUDED #include #define PROCESS_H_INCLUDED 1 #endif #endif #if DK4_HAVE_IO_H #ifndef IO_H_INCLUDED #include #define IO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_FCNTL_H #ifndef FCNTL_H_INCLUDED #include #define FCNTL_H_INCLUDED 1 #endif #endif #if DK4_HAVE_SYS_TYPES_H #ifndef SYS_TYPES_H_INCLUDED #include #define SYS_TYPES_H_INCLUDED 1 #endif #endif #if DK4_HAVE_SIGNAL_H #ifndef SIGNAL_H_INCLUDED #include #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; }