204 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| /*
 | |
| Copyright (c) 2003-2004 Roland Mainz <roland.mainz@nrubsig.org>
 | |
| Copyright (c) 2004      Sun Microsystems, Inc.
 | |
| 
 | |
| Permission is hereby granted, free of charge, to any person obtaining a copy
 | |
| of this software and associated documentation files (the "Software"), to deal
 | |
| in the Software without restriction, including without limitation the rights
 | |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | |
| copies of the Software, and to permit persons to whom the Software is
 | |
| furnished to do so, subject to the following conditions:
 | |
| 
 | |
| The above copyright notice and this permission notice shall be included in
 | |
| all copies or substantial portions of the Software.
 | |
| 
 | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | |
| COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | |
| IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
| Except as contained in this notice, the names of the copyright holders shall
 | |
| not be used in advertising or otherwise to promote the sale, use or other
 | |
| dealings in this Software without prior written authorization from said
 | |
| copyright holders.
 | |
| */
 | |
| 
 | |
| #ifdef HAVE_DIX_CONFIG_H
 | |
| #include <dix-config.h>
 | |
| #endif
 | |
| 
 | |
| #include <unistd.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| #include <ctype.h>
 | |
| #include <signal.h>
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <string.h>
 | |
| #ifdef __hpux
 | |
| #include <sys/sysmacros.h>
 | |
| #endif
 | |
| 
 | |
| #include "spooler.h"
 | |
| 
 | |
| /*
 | |
|  * The string LIST_QUEUES_* is fed to a shell to generate an ordered
 | |
|  * list of available printers on the system. These string definitions
 | |
|  * are taken from the file PrintSubSys.C within the code for the 
 | |
|  * dtprintinfo program.
 | |
|  */
 | |
| #define LIST_QUEUES_AIX4 \
 | |
|   "lsallq | grep -v '^bsh$' | sort | uniq"
 | |
| 
 | |
| #define LIST_QUEUES_HPUX \
 | |
|   "LANG=C lpstat -v | " \
 | |
|   "awk '" \
 | |
|   " $2 == \"for\" " \
 | |
|   "   { " \
 | |
|   "      x = match($3, /:/); " \
 | |
|   "      print substr($3, 1, x-1)" \
 | |
|   "   }' | sort | uniq"
 | |
| 
 | |
| #define LIST_QUEUES_OSF \
 | |
|   "LANG=C lpstat -v | " \
 | |
|   "nawk '" \
 | |
|   " $2 == \"for\"    " \
 | |
|   "   { print $4 }' " \
 | |
|   "   | sort | uniq"
 | |
| 
 | |
| #define LIST_QUEUES_UXP \
 | |
|   "LANG=C lpstat -v |" \
 | |
|   "nawk '" \
 | |
|   " $4 == \"for\" " \
 | |
|   "   { " \
 | |
|   "      x = match($5, /:/); " \
 | |
|   "      print substr($5, 1, x-1)" \
 | |
|   "   }' | sort | uniq"
 | |
| 
 | |
| /* Support both normal and LPRng output of "lpc status" */
 | |
| #define LIST_QUEUES_BSD \
 | |
|   "PATH=\"${PATH}:/usr/bin:/usr/sbin:/bin:/sbin\"\n" \
 | |
|   "export PATH\n" \
 | |
|   \
 | |
|   "which_tool()\n" \
 | |
|   "{\n" \
 | |
|   "  echo \"${PATH}\" | tr \":\" \"\n\" | while read i ; do ls -1ad \"${i}/${1}\" 2>/dev/null ; done\n" \
 | |
|   "}\n" \
 | |
|   \
 | |
|   "(\n" \
 | |
|   "WHICH_LPC=\"`which_tool lpc`\"\n" \
 | |
|   \
 | |
|   "if [ \"`which_tool nawk`\" != \"\" ] ; then\n" \
 | |
|   "    NAWK=\"nawk\"\n" \
 | |
|   "else\n" \
 | |
|   "    NAWK=\"awk\"\n" \
 | |
|   "fi\n" \
 | |
|   \
 | |
|   "[ \"${WHICH_LPC}\"    != \"\" ] && (LANG=C lpc status    | ${NAWK} '/^[^ ]*:$/    && !/@/   && !/ / { print $1 }' | sed -e /:/s///)\n" \
 | |
|   "[ \"${WHICH_LPC}\"    != \"\" ] && (LANG=C lpc -a status | ${NAWK} '/^[^ ]*@[^ ]/ && !/:$/          { split( $1, name, \"@\" ); print name[1]; }')\n" \
 | |
|   ") | egrep -v -i \" |^all$\" | sort | uniq"
 | |
| 
 | |
| #define LIST_QUEUES_SYSV \
 | |
|   "PATH=\"${PATH}:/usr/bin:/usr/sbin:/bin:/sbin\"\n" \
 | |
|   "export PATH\n" \
 | |
|   \
 | |
|   "which_tool()\n" \
 | |
|   "{\n" \
 | |
|   "  echo \"${PATH}\" | tr \":\" \"\n\" | while read i ; do ls -1ad \"${i}/${1}\" 2>/dev/null ; done\n" \
 | |
|   "}\n" \
 | |
|   \
 | |
|   "(\n" \
 | |
|   "WHICH_LPSTAT=\"`which_tool lpstat`\"\n" \
 | |
|   \
 | |
|   "if [ \"`which_tool nawk`\" != \"\" ] ; then\n" \
 | |
|   "    NAWK=\"nawk\"\n" \
 | |
|   "else\n" \
 | |
|   "    NAWK=\"awk\"\n" \
 | |
|   "fi\n" \
 | |
|   \
 | |
|   "[ \"${WHICH_LPSTAT}\" != \"\" ] && (LANG=C lpstat -v     | ${NAWK} ' $2 == \"for\" { x = match($3, /:/); print substr($3, 1, x-1)   }')\n" \
 | |
|   ") | egrep -v -i \" |^all$\" | sort | uniq"
 | |
| 
 | |
| #define LIST_QUEUES_SOLARIS "LANG=C lpget -k description " \
 | |
|   "`lpstat -v " \
 | |
|     "| nawk '$2 == \"for\" { x = match($3, /:/); print substr($3, 1,x-1) }' " \
 | |
|     "| sort -u` " \
 | |
|   "| nawk -F: ' NF == 2 { name=$1 } " \
 | |
|              " NF == 1 { sub(\"^.*description\\( - undefined|=\\)\",\"\"); " \
 | |
|                         " printf \"%s\txp-printerattr.descriptor=%s\\n\",  name, $1 } '"
 | |
| 
 | |
| #define LIST_QUEUES_OTHER \
 | |
|   "LANG=C lpstat -v | " \
 | |
|   "nawk '" \
 | |
|   " $2 == \"for\" " \
 | |
|   "   { " \
 | |
|   "      x = match($3, /:/); " \
 | |
|   "      print substr($3, 1, x-1)" \
 | |
|   "   }' | sort | uniq"
 | |
|   
 | |
| #define DEFAULT_SPOOL_COMMAND_HPUX      "/usr/bin/lp -d %printer-name% -o raw -n %copy-count% -t %job-name% %options%"
 | |
| #define DEFAULT_SPOOL_COMMAND_BSD       "/usr/bin/lpr -P %printer-name% -#%copy-count% -T %job-name% %options%"
 | |
| #define DEFAULT_SPOOL_COMMAND_SYSV      "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%"
 | |
| #define DEFAULT_SPOOL_COMMAND_SOLARIS   "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%"
 | |
| #define DEFAULT_SPOOL_COMMAND_OTHER     "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%"
 | |
| 
 | |
| 
 | |
| /* List of spooler types and the commands used to enumerate
 | |
|  * print queues and submit print jobs */
 | |
| XpSpoolerType xpstm[] =
 | |
| {
 | |
|   /* OS-specific spoolers */
 | |
|   { "aix",      LIST_QUEUES_AIX4,       DEFAULT_SPOOL_COMMAND_OTHER      },
 | |
|   { "aix4",     LIST_QUEUES_AIX4,       DEFAULT_SPOOL_COMMAND_OTHER      },
 | |
|   { "bsd",      LIST_QUEUES_BSD,        DEFAULT_SPOOL_COMMAND_BSD        },
 | |
|   { "osf",      LIST_QUEUES_OSF,        DEFAULT_SPOOL_COMMAND_OTHER      },
 | |
|   { "solaris",  LIST_QUEUES_SOLARIS,    DEFAULT_SPOOL_COMMAND_SOLARIS    },
 | |
|   { "sysv",     LIST_QUEUES_SYSV,       DEFAULT_SPOOL_COMMAND_SYSV       },
 | |
|   { "uxp",      LIST_QUEUES_UXP,        DEFAULT_SPOOL_COMMAND_OTHER      },
 | |
|   /* crossplatform spoolers */
 | |
|   { "cups",     LIST_QUEUES_SYSV,       DEFAULT_SPOOL_COMMAND_SYSV       },
 | |
|   { "lprng",    LIST_QUEUES_BSD,        DEFAULT_SPOOL_COMMAND_BSD        },
 | |
|   /* misc */
 | |
|   { "other",    LIST_QUEUES_OTHER,      DEFAULT_SPOOL_COMMAND_OTHER      },
 | |
|   { "none",     NULL,                   NULL                             },
 | |
|   { NULL,       NULL,                   NULL                             }
 | |
| };
 | |
| 
 | |
| /* Used by Init.c and attributes.c */
 | |
| XpSpoolerTypePtr spooler_type = NULL;
 | |
| 
 | |
| XpSpoolerTypePtr XpSpoolerNameToXpSpoolerType(char *name)
 | |
| {
 | |
|   XpSpoolerTypePtr curr = xpstm;
 | |
|   
 | |
|   while( curr->name != NULL )
 | |
|   {
 | |
|     if( !strcasecmp(name, curr->name) )
 | |
|       return curr;
 | |
|       
 | |
|     curr++;
 | |
|   }
 | |
|   
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| static char *spooler_namelist = NULL;
 | |
| 
 | |
| char *XpGetSpoolerTypeNameList(void)
 | |
| {
 | |
|   if( spooler_namelist )
 | |
|     return spooler_namelist;
 | |
|   
 | |
|   return XPDEFAULTSPOOLERNAMELIST;
 | |
| }
 | |
| 
 | |
| void XpSetSpoolerTypeNameList(char *namelist)
 | |
| {
 | |
|   spooler_namelist = namelist;
 | |
| }
 | |
| 
 | |
| 
 |