diff options
Diffstat (limited to 'Xprint/Init.c')
-rw-r--r-- | Xprint/Init.c | 284 |
1 files changed, 202 insertions, 82 deletions
diff --git a/Xprint/Init.c b/Xprint/Init.c index c936f4542..d773ccf62 100644 --- a/Xprint/Init.c +++ b/Xprint/Init.c @@ -50,7 +50,6 @@ copyright holders. ** ********************************************************* ** ********************************************************************/ -/* $XFree86: xc/programs/Xserver/Xprint/Init.c,v 1.15 2003/10/29 22:11:54 tsi Exp $ */ #include <unistd.h> #include <stdlib.h> @@ -91,6 +90,7 @@ typedef char *XPointer; #include "attributes.h" #include "os.h" +#include "spooler.h" static void GenericScreenInit( int index, @@ -116,57 +116,6 @@ static Bool InitPrintDrivers( #define MODELDIRNAME "/models" #define FONTDIRNAME "/fonts" -/* - * 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. - */ -#ifdef AIXV4 -const char *LIST_QUEUES = "lsallq | grep -v '^bsh$' | sort"; -#else -#ifdef hpux -const char *LIST_QUEUES = "LANG=C lpstat -v | " - "awk '" - " $2 == \"for\" " - " { " - " x = match($3, /:/); " - " print substr($3, 1, x-1)" - " }' | sort"; -#else -#ifdef __osf__ - const char *LIST_QUEUES = "LANG=C lpstat -v | " - "nawk '" - " $2 == \"for\" " - " { print $4 }' " - " | sort"; -#else -#ifdef __uxp__ -const char *LIST_QUEUES = "LANG=C lpstat -v | " - "nawk '" - " $4 == \"for\" " - " { " - " x = match($5, /:/); " - " print substr($5, 1, x-1)" - " }' | sort"; -#else -#if defined(CSRG_BASED) || defined(linux) || defined(ISC) || defined(__GNUC__) -const char *LIST_QUEUES = "LANG=C lpc status | grep -v '^\t' | " - "sed -e /:/s/// | sort"; -#else -const char *LIST_QUEUES = "LANG=C lpstat -v | " - "nawk '" - " $2 == \"for\" " - " { " - " x = match($3, /:/); " - " print substr($3, 1, x-1)" - " }' | sort"; -#endif -#endif -#endif -#endif -#endif - #ifdef XPRASTERDDX static @@ -183,9 +132,9 @@ PixmapFormatRec RasterPixmapFormats[] = { static PixmapFormatRec ColorPclPixmapFormats[] = { - { 1, 1, BITMAP_SCANLINE_PAD }, - { 8, 8, BITMAP_SCANLINE_PAD }, - { 24,32, BITMAP_SCANLINE_PAD } + { 1, 1, BITMAP_SCANLINE_PAD }, + { 8, 8, BITMAP_SCANLINE_PAD }, + { 24, 32, BITMAP_SCANLINE_PAD } }; #define NUMCPCLFORMATS (sizeof ColorPclPixmapFormats)/(sizeof ColorPclPixmapFormats[0]) @@ -211,9 +160,9 @@ PixmapFormatRec MonoPclPixmapFormats[] = { static PixmapFormatRec PSPixmapFormats[] = { - { 1, 1, BITMAP_SCANLINE_PAD }, - { 8, 8, BITMAP_SCANLINE_PAD }, - { 24,32, BITMAP_SCANLINE_PAD } + { 1, 1, BITMAP_SCANLINE_PAD }, + { 8, 8, BITMAP_SCANLINE_PAD }, + { 24, 32, BITMAP_SCANLINE_PAD } }; #define NUMPSFORMATS (sizeof PSPixmapFormats)/(sizeof PSPixmapFormats[0]) @@ -325,10 +274,64 @@ typedef struct _driverMapping { int screenNum; } DriverMapEntry, *DriverMapPtr; +static const char configFilePath[] = +"/etc/dt/config/print:/usr/dt/config/print"; + +static const char printServerConfigDir[] = "XPSERVERCONFIGDIR"; + +static int printScreenPrivIndex, + printWindowPrivIndex, + printGCPrivIndex; +static unsigned long printGeneration = 0; static char *configFileName = (char *)NULL; static Bool freeDefaultFontPath = FALSE; static char *origFontPath = (char *)NULL; +static Bool xprintInitGlobalsCalled = FALSE; +/* + * This function is responsible for doing initalisation of any global + * variables at an very early point of server startup (even before + * |ProcessCommandLine()|. + */ +void XprintInitGlobals(void) +{ + xprintInitGlobalsCalled = TRUE; + +#ifdef SMART_SCHEDULE + /* Somehow the XF86 "smart scheduler" completely kills the Xprint DDX + * (see http://xprint.freedesktop.org/cgi-bin/bugzilla/show_bug.cgi?id=467 + * ("Xfree86's "smart scheduler" breaks Xprt") */ + SmartScheduleDisable = TRUE; +#endif /* SMART_SCHEDULE */ +} + +/* + * XprintUseMsg() prints usage for the Xprint-specific options + */ +void XprintUseMsg() +{ + XpSpoolerTypePtr curr = xpstm; + + /* Option '-XpFile' */ + ErrorF("-XpFile file specifies an alternate `Xprinters' file, rather\n"); + ErrorF(" than the default one (e.g.\n"); + ErrorF(" `${XPCONFIGDIR}/${LANG}/print/Xprinters') or\n"); + ErrorF(" `${XPCONFIGDIR}/C/print/Xprinters'.\n"); + + /* Option '-XpSpoolerType' */ + ErrorF("-XpSpoolerType string specifies a spooler type.\n"); + ErrorF(" Supported values are:\n"); + + while( curr->name != NULL ) + { + ErrorF(" - '%s'\n", curr->name); + curr++; + } + ErrorF(" (multiple values can be specified, seperated by ':',\n"); + ErrorF(" the first active spooler will be chosen).\n"); + ErrorF(" default is '%s'.\n", XPDEFAULTSPOOLERNAMELIST); +} + /* * XprintOptions checks argv[i] to see if it is our command line * option specifying a configuration file name. It returns the index @@ -340,6 +343,7 @@ XprintOptions( char **argv, int i) { + extern void ddxUseMsg(); if(strcmp(argv[i], "-XpFile") == 0) { if ((i + 1) >= argc) { @@ -349,8 +353,19 @@ XprintOptions( configFileName = argv[i + 1]; return i + 2; } + else if(strcmp(argv[i], "-XpSpoolerType") == 0) + { + if ((i + 1) >= argc) { + ddxUseMsg (); + return i + 2; + } + XpSetSpoolerTypeNameList(argv[i + 1]); + return i + 2; + } else + { return i; + } } /************************************************************ @@ -417,7 +432,7 @@ FreePrinterDb(void) { PrinterDbPtr pCurEntry, pNextEntry; - for(pCurEntry = printerDb, pNextEntry = 0; + for(pCurEntry = printerDb, pNextEntry = (PrinterDbPtr)NULL; pCurEntry != (PrinterDbPtr)NULL; pCurEntry = pNextEntry) { pNextEntry = pCurEntry->next; @@ -429,7 +444,7 @@ FreePrinterDb(void) */ xfree(pCurEntry); } - printerDb = 0; + printerDb = (PrinterDbPtr)NULL; } /* @@ -460,11 +475,12 @@ AddPrinterDbName(char *name) return TRUE; } -static void +static int AugmentPrinterDb(const char *command) { FILE *fp; char name[256]; + int num_printers = 0; /* Number of printers we found */ fp = popen(command, "r"); /* XXX is a 256 character limit overly restrictive for printer names? */ @@ -472,8 +488,10 @@ AugmentPrinterDb(const char *command) { name[strlen(name) - 1] = (char)'\0'; /* strip the \n */ AddPrinterDbName(name); + num_printers++; } pclose(fp); + return num_printers; } /* @@ -592,7 +610,7 @@ StoreDriverNames(void) "xp-ddx-identifier"); if(pEntry->driverName == (char *)NULL || strlen(pEntry->driverName) == 0 || - GetInitFunc(pEntry->driverName) == 0) + GetInitFunc(pEntry->driverName) == (Bool(*)())NULL) { if (pEntry->driverName && (strlen(pEntry->driverName) != 0)) { ErrorF("Xp Extension: Can't load driver %s\n", @@ -650,7 +668,7 @@ GetConfigFileName(void) /* * Check for a LANG-specific file. */ - if ((dirName = XpGetConfigDir(TRUE)) != 0) + if(dirName = XpGetConfigDir(TRUE)) { filePath = (char *)xalloc(strlen(dirName) + strlen(XPRINTERSFILENAME) + 2); @@ -669,7 +687,7 @@ GetConfigFileName(void) xfree(filePath); } - if ((dirName = XpGetConfigDir(FALSE)) != 0) + if(dirName = XpGetConfigDir(FALSE)) { filePath = (char *)xalloc(strlen(dirName) + strlen(XPRINTERSFILENAME) + 2); @@ -701,6 +719,7 @@ GetConfigFileName(void) static PrinterDbPtr BuildPrinterDb(void) { + char *printerList, *augmentCmd = (char *)NULL; Bool defaultAugment = TRUE, freeConfigFileName; if(configFileName && access(configFileName, R_OK) != 0) @@ -727,7 +746,7 @@ BuildPrinterDb(void) { while((tok = strtok((char *)NULL, " \t")) != (char *)NULL) { - if ((ptr = MbStrchr(tok, '\012')) != 0) + if(ptr = MbStrchr(tok, '\012')) *ptr = (char)'\0'; AddPrinterDbName(tok); } @@ -768,7 +787,43 @@ BuildPrinterDb(void) if(defaultAugment == TRUE) { - AugmentPrinterDb(LIST_QUEUES); + XpSpoolerTypePtr curr_spooler_type; /* spooler we are currently probing for queues */ + int num_printers_found; /* number of printers found by |AugmentPrinterDb()| */ + char *tok_lasts; /* strtok_r() position token */ + char *spnamelist; /* list of spooler names, seperated by ":" */ + char *spname; /* spooler name */ + + spnamelist = strdup(XpGetSpoolerTypeNameList()); /* strtok_r() modifies string so dup' it first */ + + for( spname = strtok_r(spnamelist, ":", &tok_lasts) ; + spname != NULL ; + spname = strtok_r(NULL, ":", &tok_lasts) ) + { + curr_spooler_type = XpSpoolerNameToXpSpoolerType(spname); + if(!curr_spooler_type) + { + FatalError("BuildPrinterDb: No spooler type entry found for '%s'.\n", spname); + } + + if(curr_spooler_type->list_queues_command == NULL || + strlen(curr_spooler_type->list_queues_command) == 0) + { + continue; + } + + num_printers_found = AugmentPrinterDb(curr_spooler_type->list_queues_command); + /* Did we found a spooler which works ? */ + if(num_printers_found > 0) + { + spooler_type = curr_spooler_type; +#ifdef DEBUG_gisburn + fprintf(stderr, "BuildPrinterDb: using '%s'.\n", spooler_type->name); +#endif /* DEBUG_gisburn */ + break; + } + } + + free(spnamelist); } MergeNameMap(); @@ -951,7 +1006,7 @@ FindFontDir( return (char *)NULL; configDir = XpGetConfigDir(TRUE); - if ((fontDir = ValidateFontDir(configDir, modelName)) != 0) + if(fontDir = ValidateFontDir(configDir, modelName)) { xfree(configDir); return fontDir; @@ -1013,8 +1068,8 @@ AddToFontPath( static void AugmentFontPath(void) { - char *modelID, **allIDs = (char **)NULL; - PrinterDbPtr pDbEntry; + char *newPath, *modelID, **allIDs = (char **)NULL; + PrinterDbPtr pDb, pDbEntry; int numModels, i; if(!origFontPath) @@ -1072,7 +1127,7 @@ AugmentFontPath(void) for(i = 0; allIDs != (char **)NULL && allIDs[i] != (char *)NULL; i ++) { char *fontDir; - if ((fontDir = FindFontDir(allIDs[i])) != 0) + if(fontDir = FindFontDir(allIDs[i])) { AddToFontPath(fontDir); xfree(fontDir); @@ -1162,7 +1217,7 @@ XpClientIsPrintClient( * fpe->name. */ if(fpe->name_length < PATH_PREFIX_LEN || - (strlen(fontDir) != (unsigned)(fpe->name_length - PATH_PREFIX_LEN)) || + (strlen(fontDir) != (fpe->name_length - PATH_PREFIX_LEN)) || strncmp(fontDir, fpe->name + PATH_PREFIX_LEN, fpe->name_length - PATH_PREFIX_LEN)) { @@ -1235,6 +1290,18 @@ PrinterInitOutput( char **driverNames; char *configDir; + /* This should NEVER happen, but... */ + if( !xprintInitGlobalsCalled ) + { + FatalError("Internal error: XprintInitGlobals() not called."); + } +#ifdef SMART_SCHEDULE + if( SmartScheduleDisable != TRUE ) + { + FatalError("Internal error: XF86 smart scheduler incompatible to Xprint DDX."); + } +#endif /* SMART_SCHEDULE */ + /* * this little test is just a warning at startup to make sure * that the config directory exists. @@ -1254,10 +1321,9 @@ PrinterInitOutput( xfree(configDir); } else { - ErrorF("Xp Extension: could not find config dir %s\n", - configDir ? configDir : XPRINTDIR); - - if (configDir) xfree(configDir); + /* Refuse to start when we do not have our config dir... */ + FatalError("Xp Extension: could not find config dir %s\n", + configDir ? configDir : XPRINTDIR); } if(printerDb != (PrinterDbPtr)NULL) @@ -1414,7 +1480,7 @@ InitPrintDrivers( } if(callInit == TRUE) { - pBFunc initFunc; + Bool (*initFunc)(); initFunc = GetInitFunc(pDb->driverName); if(initFunc(index, pScreen, argc, argv) == FALSE) { @@ -1451,9 +1517,10 @@ GenericScreenInit( int argc, char **argv) { + int i; float fWidth, fHeight, maxWidth, maxHeight; unsigned short width, height; - PrinterDbPtr pDb; + PrinterDbPtr pDb, pDb2; int res, maxRes; /* @@ -1477,6 +1544,7 @@ GenericScreenInit( { if(pDb->screenNum == index) { + XpValidatePoolsRec *pValRec; pVFunc dimensionsFunc; @@ -1506,6 +1574,57 @@ GenericScreenInit( } /* + * QualifyName - takes an unqualified file name such as X6printers and + * a colon-separated list of directory path names such as + * /etc/opt/dt:/opt/dt/config. + * + * Returns a fully qualified file path name such as /etc/opt/dt/X6printers. + * The returned value is malloc'd, and the caller is responsible for + * freeing the associated memory. + */ +static char * +QualifyName(fileName, searchPath) + char *fileName; + char *searchPath; +{ + char * curPath = searchPath; + char * nextPath; + char * chance; + FILE *pFile; + + if (fileName == NULL || searchPath == NULL) + return NULL; + + while (1) { + if ((nextPath = strchr(curPath, ':')) != NULL) + *nextPath = 0; + + chance = (char *)xalloc(strlen(curPath) + strlen(fileName) + 2); + sprintf(chance,"%s/%s",curPath,fileName); + + /* see if we can read from the file */ + if((pFile = fopen(chance, "r")) != (FILE *)NULL) + { + fclose(pFile); + /* ... restore the colon, .... */ + if (nextPath) + *nextPath = ':'; + + return chance; + } + + xfree(chance); + + if (nextPath == NULL) /* End of path list? */ + break; + + /* try the next path */ + curPath = nextPath + 1; + } + return NULL; +} + +/* * FillPrinterListEntry fills in a single XpDiListEntry element with data * derived from the supplied PrinterDbPtr element. * @@ -1548,12 +1667,11 @@ GetPrinterListInfo( int localeLen, char *locale) { - PrinterDbPtr pDb; + PrinterDbPtr pDb, pDb2; for(pDb = printerDb; pDb != (PrinterDbPtr)NULL; pDb = pDb->next) { - if (strlen(pDb->name) == (unsigned)nameLen - && !strncmp(pDb->name, name, nameLen)) + if(strlen(pDb->name) == nameLen && !strncmp(pDb->name, name, nameLen)) { FillPrinterListEntry(pEntry, pDb, localeLen, locale); return TRUE; @@ -1598,7 +1716,7 @@ XpDiGetPrinterList( if(!nameLen || name == (char *)NULL) { int i; - PrinterDbPtr pDb; + PrinterDbPtr pDb, pDb2; for(pDb = printerDb, i = 0; pDb != (PrinterDbPtr)NULL; pDb = pDb->next, i++) @@ -1648,11 +1766,12 @@ WindowPtr XpDiValidatePrinter(char *printerName, int printerNameLen) { PrinterDbPtr pCurEntry; + WindowPtr pWin; for(pCurEntry = printerDb; pCurEntry != (PrinterDbPtr)NULL; pCurEntry = pCurEntry->next) { - if(strlen(pCurEntry->name) == (unsigned)printerNameLen && + if(strlen(pCurEntry->name) == printerNameLen && !strncmp(pCurEntry->name, printerName, printerNameLen)) return WindowTable[pCurEntry->screenNum]; } @@ -1680,3 +1799,4 @@ XpDiGetDriverName(int index, char *printerName) return (char *)NULL; /* XXX Should we supply a default driverName? */ } + |