205 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
 | 
						|
/* $Xorg: spooler.c,v 1.1 2003/09/14 1:19:56 gisburn Exp $ */
 | 
						|
/*
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
 |