diff options
Diffstat (limited to 'Xprint/attributes.c')
-rw-r--r-- | Xprint/attributes.c | 137 |
1 files changed, 102 insertions, 35 deletions
diff --git a/Xprint/attributes.c b/Xprint/attributes.c index e1fce8cb3..d02c54e37 100644 --- a/Xprint/attributes.c +++ b/Xprint/attributes.c @@ -44,18 +44,15 @@ copyright holders. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/attributes.c,v 1.21 2003/12/19 02:05:38 dawes Exp $ */ -#include <X11/Xproto.h> +#include <Xproto.h> #include <string.h> #include <stdlib.h> -#include <sys/types.h> #include <sys/wait.h> #include <pwd.h> #if (defined(sun) && defined(SVR4)) || (defined(SCO)) #include <wchar.h> #endif - #include "scrnintstr.h" #include <X11/extensions/Printstr.h> @@ -66,11 +63,13 @@ copyright holders. #include "Xresource.h" #include "Xrm.c" +#include "spooler.h" + static XrmDatabase CopyDb(XrmDatabase inDb); extern XrmDatabase XpSpoolerGetServerAttributes(void); -static unsigned long attrGeneration = 0; +static int attrGeneration = 0; typedef struct { XrmDatabase *pDb; @@ -137,6 +136,26 @@ static const char XPMODELDIR[] = "/models"; static char NULL_STRING[] = "\0"; /* + * XpGetConfigDirBase returns a string containing the path name of the base + * where the print server configuration directory is localed. + */ +static +char *XpGetConfigDirBase() +{ + char **configDir; + + /* + * If the XPCONFIGDIR environment variable is not set, then use the + * compile-time constant XPRINTDIR. XPRINTDIR is passed in on the + * compile command line, and is defined in $(TOP)/config/cf/Project.tmpl. + */ + if((configDir = getenv("XPCONFIGDIR")) == (char *)NULL) + configDir = XPRINTDIR; + + return configDir; +} + +/* * XpGetConfigDir returns a string containing the path name of the print * server configuration directory. If the useLocale parameter is False * the it returns the path to the "/C" directory. If the useLocale @@ -164,13 +183,7 @@ XpGetConfigDir(Bool useLocale) } } - /* - * If the XPCONFIGDIR environment variable is not set, then use the - * compile-time constant XPRINTDIR. XPRINTDIR is passed in on the - * compile command line, and is defined in $(TOP)/config/cf/Project.tmpl. - */ - if((configDir = getenv("XPCONFIGDIR")) == (char *)NULL) - configDir = XPRINTDIR; + configDir = XpGetConfigDirBase(); dirName = (char *)xalloc(strlen(configDir) + strlen(XPDIR) + strlen(langDir) + 1); @@ -306,7 +319,7 @@ BuildPrinterAttrs( if(systemAttributes.printers != (XrmDatabase)NULL) { - char *fileName; + char *dirName, *fileName; XrmDatabase modelDB = (XrmDatabase)NULL; XrmName xrm_name[5], xrm_class[2]; XrmRepresentation rep_type; @@ -606,6 +619,7 @@ XpGetOneAttribute( { ContextAttrPtr pCtxtAttrs; XrmDatabase db = (XrmDatabase)NULL; + char *retVal; XrmName xrm_name[3]; XrmRepresentation rep_type; XrmValue value; @@ -669,10 +683,10 @@ XpGetOneAttribute( */ void XpPutOneAttribute( - XpContextPtr pContext, - XPAttributes class, - const char* attributeName, - const char* value) + XpContextPtr pContext, + XPAttributes class, + const char* attributeName, + const char* value) { ContextAttrPtr pCtxtAttrs; XrmDatabase db; @@ -797,7 +811,7 @@ AppendEntry( char *s, c; if (*type != XrmQString) - return False; + return; for (firstNameSeen = False; *quarks; bindings++, quarks++) { if (*bindings == XrmBindLoosely) { @@ -856,6 +870,7 @@ XpGetAttributes( { ContextAttrPtr pCtxtAttrs; XrmDatabase db = (XrmDatabase)NULL; + char *retVal; StringDbStruct enumStruct; XrmQuark empty = NULLQUARK; @@ -1064,6 +1079,34 @@ XpSpoolerGetServerAttributes(void) } /* + * ExecuteCommand takes two pointers - the command to execute, + * and the "argv" style NULL-terminated vector of arguments for the command. + * We wait for the command to terminate before continuing to ensure that + * we don't delete the job file before the spooler has made a copy. + */ +static void +ExecCommand(pCommand, argVector) + char *pCommand; + char **argVector; +{ + pid_t childPid; + int status; + + if((childPid = fork()) == 0) + { + /* return BadAlloc? */ + if (execv(pCommand, argVector) == -1) { + FatalError("unable to exec '%s'", pCommand); + } + } + else + { + (void) waitpid(childPid, &status, 0); + } + return; +} + +/* * SendFileToCommand takes three character pointers - the file name, * the command to execute, * and the "argv" style NULL-terminated vector of arguments for the command. @@ -1119,7 +1162,9 @@ SendFileToCommand( */ if(userName) { - if(geteuid() == (uid_t)0) + uid_t myUid; + + if((myUid = geteuid()) == (uid_t)0) { struct passwd *pPasswd; @@ -1136,6 +1181,8 @@ SendFileToCommand( } else { + int res; + (void) close(pipefd[0]); outPipe = fdopen(pipefd[1], "w"); @@ -1155,6 +1202,7 @@ SendFileToCommand( * store for the supplied print context. The ReplaceAnyString utility * routine is used to perform the actual replacements. */ +extern char *ReplaceAnyString(char *, char *, char *); static char * ReplaceAllKeywords( @@ -1196,6 +1244,10 @@ ReplaceAllKeywords( else command = ReplaceAnyString(command, "%options%", ""); + /* New in xprint.mozdev.org release 007 - replace "%xpconfigdir%" with + * location of $XPCONFIGDIR */ + command = ReplaceAnyString(command, "%xpconfigdir%", XpGetConfigDirBase()); + return command; } @@ -1366,43 +1418,58 @@ VectorizeCommand( char ***pVector, XpContextPtr pContext) { - char *cmdName; + char *cmdName, *curTok; + int i, numChars; if(command == (char *)NULL) return (char *)NULL; - (void) GetToken(command, &cmdName); + numChars = GetToken(command, &cmdName); if(cmdName == (char *)NULL) return (char *)NULL; - *pVector = BuildArgVector(command, pContext); + /* Mangle the command name, too... */ + cmdName = ReplaceAllKeywords(pContext, cmdName); + if(cmdName == (char *)NULL) + return (char *)NULL; + + *pVector = BuildArgVector(command, pContext); + return cmdName; } -#ifdef hpux -static char DEFAULT_SPOOL_COMMAND[] = "/usr/bin/lp -d %printer-name% -o raw -n %copy-count% -t %job-name% %options%"; -#else -static char DEFAULT_SPOOL_COMMAND[] = "/usr/bin/lp -d %printer-name% -n %copy-count% -t %job-name% %options%"; -#endif - int -XpSubmitJob( - char *fileName, - XpContextPtr pContext) +XpSubmitJob(fileName, pContext) + char *fileName; + XpContextPtr pContext; { - char **vector, *cmdNam, *command, *userName; + char **vector, *cmdNam, *cmdOpt, *command, *userName; int i; command = XpGetOneAttribute(pContext, XPPrinterAttr, "xp-spooler-command"); if(command == (char *)NULL || strlen(command) == 0) - command = strdup(DEFAULT_SPOOL_COMMAND); + { + if( spooler_type ) + { + command = strdup(spooler_type->spool_command); + } + else + { + ErrorF("XpSubmitJob: No default spool command defined.\n"); + } + } else + { command = strdup(command); + } if(command == (char *)NULL) + { + ErrorF("XpSubmitJob: No spooler command found, cannot submit job.\n"); return BadAlloc; - + } + cmdNam = VectorizeCommand(command, &vector, pContext); xfree(command); @@ -1430,7 +1497,6 @@ XpSubmitJob( FreeVector(vector); xfree(cmdNam); - return Success; } /* @@ -1503,6 +1569,7 @@ XpGetTrayMediumFromContext(XpContextPtr pCon, { char *defMedium, *defTray; char *t, *m; + char *pS, *pE, *pLast; defMedium = XpGetOneAttribute( pCon, XPPageAttr, "default-medium" ); |