123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: fontpath.c /main/4 1995/10/27 16:13:29 rswiston $ */
- /* *
- * (c) Copyright 1993, 1994 Hewlett-Packard Company *
- * (c) Copyright 1993, 1994 International Business Machines Corp. *
- * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
- * (c) Copyright 1993, 1994 Novell, Inc. *
- */
- /*
- ** fontpath.c - font path modification routines
- **
- ** $fontpath.c,v 1.1 93/06/24 14:52:10 bill Exp $
- **
- ** Copyright 1993 Hewlett-Packard Company
- */
- # include "dm.h"
- # include <signal.h>
- # include <X11/Xatom.h>
- # include <X11/Xmu/Error.h>
- #if defined(__FreeBSD__)
- # include <utmpx.h>
- #else
- # include <utmp.h>
- #endif
- # include "vgproto.h"
- /*
- ** Prototypes
- */
- int ApplyFontPathMods( struct display *d, Display *dpy );
- void GetSysParms( char **tzpp, char **fhpp, char **ftpp );
- static int PathInPList(char *path, char **fplist, int listlen);
- static int PathInZList(char *path, char *fplist, int listlen);
- static int SeparateParts( char **path );
- void GenerateAuthData(char *auth, int len); // genauth.c
- static void
- DebugFontPath(char *note, char **path, int nelems)
- {
- int i;
- Debug(" %s: %d elements\n",note,nelems);
- for (i=0; i<nelems; i++)
- Debug(" %s\n",path[i]);
- }
- static int
- ErrorHandler(Display *dpy, XErrorEvent *event)
- {
- XmuPrintDefaultErrorMessage(dpy, event, stderr);
- return 0; /* nonfatal */
- }
- /* ________________________________________________________________
- **| |
- **| ApplyFontPathMods(d) - |
- **| |
- **| If new font path mods are mandated, fabricate and apply |
- **| an appropriate new complete X server font path. |
- **| |
- **| Specify: d = pointer to display structure |
- **| |
- **| Returns: nothing |
- **|________________________________________________________________|
- */
- int
- ApplyFontPathMods( struct display *d, Display *dpy )
- {
- FILE *fin;
- char *s,*t;
- char *fph = NULL;
- char *fpt = NULL;
- char **fontPath,**newList;
- int numHeads = 0;
- int numTails = 0;
- int i,j,k,numPaths;
- Debug("ApplyFontPathMods() for %s\n",d->name);
- if (d->displayType.location == Foreign) {
- Debug(" Foreign display\n");
- return 0;
- }
- if (!(fontPath=XGetFontPath(dpy, &numPaths))) {
- Debug(" Can't get font path\n");
- return 0;
- }
- /*
- ** Font path mods can come from (in priority order):
- **
- ** 1. FONT_PATH_HEAD/TAIL definitions in /etc/src.sh
- ** 2. fontPathHead/Tail resources
- */
- GetSysParms(0,&fph,&fpt);
- if (fph) { s = "sys parm file"; }
- else if (fpHead) { s = "resource"; fph = strdup(fpHead); }
- if (fph && !*fph) { free(fph); fph = NULL; }
- if (fph) Debug(" +fp (%s) %s\n",s,fph);
- if (fpt) { s = "sys parm file"; }
- else if (fpTail) { s = "resource"; fpt = strdup(fpTail); }
- if (fpt && !*fpt) { free(fpt); fpt = NULL; }
- if (fpt) Debug(" fp+ (%s) %s\n",s,fpt);
- /*
- ** Break up fph and fpt into constituent parts and
- ** then reconstruct the complete, modified font path.
- ** During reconstruction we also eliminate redundancies.
- */
- numHeads = SeparateParts(&fph);
- numTails = SeparateParts(&fpt);
- if (numHeads || numTails) {
- newList = (char **) malloc((numHeads+numPaths+numTails)
- * sizeof(char *));
- if (newList) {
- for (s=fph, i=j=0; j<numHeads; j++) {
- if (!PathInPList(s,newList,i))
- newList[i++] = s;
- while (*s) s++; s++;
- }
- for (j=0; j<numPaths; j++) {
- if (!PathInPList(fontPath[j],newList,i) &&
- !PathInZList(fontPath[j],fpt,numTails)) {
- newList[i++] = fontPath[j];
- }
- }
- for (s=fpt, j=0; j<numTails; j++) {
- if (!PathInPList(s,newList,i))
- newList[i++] = s;
- while (*s) s++; s++;
- }
- if (debugLevel > 0)
- DebugFontPath("Request (XSetFontPath)",newList,i);
- /*
- ** Tell X server to set new font path now. Log failure,
- ** but don't let it be fatal. (Note that caller should
- ** reset error handler to elsewhere when we return.)
- */
- (void)XSetErrorHandler(ErrorHandler);
- XSetFontPath(dpy, newList, i);
- XSync(dpy, True);
- free(newList);
- if (debugLevel > 0) {
- newList = XGetFontPath(dpy, &i);
- DebugFontPath("Confirm (XGetFontPath)",newList,i);
- XFreeFontPath(newList);
- }
- }
- }
- if (fph) free(fph);
- if (fpt) free(fpt);
- XFreeFontPath(fontPath);
- return 1;
- }
- /* ___________________________________________________________________
- **| |
- **| PathInPList(path,fplist,listlen) - |
- **| |
- **| Determine if a specific fontpath element is in a list, |
- **| taking into account that identical elements may be formed |
- **| differently (with multiple embedded and trailing slashes). |
- **| |
- **| Specify: (char *)path = the single element to be tested |
- **| (char **)fplist = list of ptrs to asciz elements |
- **| (int)listlen = number of pointers in the list |
- **| |
- **| Returns: TRUE if element is in the list |
- **|___________________________________________________________________|
- */
- static int
- PathInPList(char *path, char **fplist, int listlen)
- {
- char *s,*t;
- while (listlen-- > 0) {
- for (s=path, t=fplist[listlen]; *s && (*s == *t); ) {
- t++; while (*t == '/') t++;
- s++; while (*s == '/') s++;
- }
- if (!*s && !*t) return 1;
- }
- return 0;
- }
- /* ___________________________________________________________________
- **| |
- **| PathInZList(path,fplist,listlen) - |
- **| |
- **| Determine if a specific fontpath element is in a list, |
- **| taking into account that identical elements may be formed |
- **| differently (with multiple embedded and trailing slashes). |
- **| |
- **| Specify: (char *)path = the single element to be tested |
- **| (char *)fplist = list of concatenated asciz elements |
- **| (int)listlen = number of elements in the list |
- **| |
- **| Returns: TRUE if element is in the list |
- **|___________________________________________________________________|
- */
- static int
- PathInZList(char *path, char *fplist, int listlen)
- {
- char *s,*t;
- for (t=fplist; listlen > 0; listlen--) {
- for (s=path; *s && (*s == *t); ) {
- t++; while (*t == '/') t++;
- s++; while (*s == '/') s++;
- }
- if (!*s && !*t) return 1;
- while (*t) t++; t++;
- }
- return 0;
- }
- /* ________________________________________________________________
- **| |
- **| SeparateParts(path) |
- **| |
- **| Break a comma-delimited asciz path string into its |
- **| separate asciz constituent parts. |
- **| |
- **| Specify: path = ptr to asciz path string (e.g., "as,df,jk") |
- **| |
- **| Returns: number of constituent parts, with path string |
- **| converted into as many sequential asciz strings |
- **| (e.g., "as\0df\0jk"). |
- **|________________________________________________________________|
- */
- static int
- SeparateParts( char **path )
- {
- char *t,*s;
- int nparts = 0;
- if (path && *path)
- for (s=*path; t=strtok(s,","); s=NULL, nparts++);
- return nparts;
- }
- /* ___________________________________________________________________
- **| |
- **| GetSysParms(tzpp,fhpp,ftpp) - |
- **| |
- **| Extract TZ, FONT_PATH_HEAD, and FONT_PATH_TAIL definitions |
- **| from the sys parms file (typically /etc/src.sh). |
- **| |
- **| Specify: (char **)tzpp = where to put ptr to TZ string |
- **| (char **)fhpp = where to put ptr to FONT_PATH_HEAD |
- **| (char **)ftpp = where to put ptr to FONT_PATH_TAIL |
- **| |
- **| Specify a NULL (char **) for any undesired strings. |
- **| |
- **| Returns: Appropriate pointers to malloc'ed strings (NULL pointer |
- **| if a string is neither requested nor defined). |
- **|___________________________________________________________________|
- */
- void
- GetSysParms( char **tzpp, char **fhpp, char **ftpp )
- {
- FILE *fin;
- char *s,*t,buf[256];
- if (tzpp) *tzpp = NULL;
- if (fhpp) *fhpp = NULL;
- if (ftpp) *ftpp = NULL;
- if ((*sysParmsFile != '/') || !(fin=fopen(sysParmsFile,"r"))) {
- Debug("(GetSysParms) Can't open sys parms file\n");
- return;
- }
- Debug("(GetSysParms) Reading sys parms file\n");
- while (fgets(buf,255,fin)) {
- for (t=buf; *t && *t<=' '; t++); /* t -> EOS or nonblank */
- if (!*t || *t=='#') continue; /* ignore comment lines */
- while (*t && *t!='\n') t++; /* t -> EOS or newline */
- if (*t) *t = '\0'; /* discard newline char */
- if (tzpp && !*tzpp)
- if ((s=strstr(buf,"TZ=")) && (t=strtok(s+3,"; \t")))
- *tzpp = (char *) strdup(t);
- if (fhpp && !*fhpp)
- if ((s=strstr(buf,"FONT_PATH_HEAD=")) && (t=strtok(s+15,"; \t")))
- *fhpp = (char *) strdup(t);
- if (ftpp && !*ftpp)
- if ((s=strstr(buf,"FONT_PATH_TAIL=")) && (t=strtok(s+15,"; \t")))
- *ftpp = (char *) strdup(t);
- }
- fclose(fin);
- }
|