(file) Return to ddxLoad.c CVS log (file) (dir) Up to [XFree86 CVS] / xc / programs / Xserver / xkb

  1 dawes 3.27 /* $Xorg: ddxLoad.c,v 1.3 2000/08/17 19:53:46 cpqbld Exp $ */
  2 dawes 1.1  /************************************************************
  3            Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
  4            
  5            Permission to use, copy, modify, and distribute this
  6            software and its documentation for any purpose and without
  7            fee is hereby granted, provided that the above copyright
  8            notice appear in all copies and that both that copyright
  9            notice and this permission notice appear in supporting
 10            documentation, and that the name of Silicon Graphics not be 
 11            used in advertising or publicity pertaining to distribution 
 12            of the software without specific prior written permission.
 13            Silicon Graphics makes no representation about the suitability 
 14            of this software for any purpose. It is provided "as is"
 15            without any express or implied warranty.
 16            
 17            SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
 18            SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
 19            AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
 20            GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 
 21            DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 
 22            DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 
 23 dawes 1.1  OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
 24            THE USE OR PERFORMANCE OF THIS SOFTWARE.
 25            
 26            ********************************************************/
 27 dawes 3.31 /* $XFree86: xc/programs/Xserver/xkb/ddxLoad.c,v 3.30 2002/05/31 18:46:06 dawes Exp $ */
 28 dawes 1.1  
 29            #include <stdio.h>
 30            #include <ctype.h>
 31            #define	NEED_EVENTS 1
 32            #include <X11/X.h>
 33            #include <X11/Xos.h>
 34            #include <X11/Xproto.h>
 35            #include <X11/keysym.h>
 36            #include <X11/extensions/XKM.h>
 37            #include "inputstr.h"
 38            #include "scrnintstr.h"
 39            #include "windowstr.h"
 40            #define	XKBSRV_NEED_FILE_FUNCS
 41            #include "XKBsrv.h"
 42            #include "XI.h"
 43 dawes 3.31 #include "xkb.h"
 44 dawes 1.1  
 45 dawes 3.26 #if defined(CSRG_BASED) || defined(linux) || defined(__sgi) || defined(AIXV3) || defined(__osf__) || defined(__GNU__)
 46 dawes 3.0  #include <paths.h>
 47            #endif
 48            
 49 dawes 1.1  #ifndef PATH_MAX
 50            #ifdef MAXPATHLEN
 51            #define	PATH_MAX MAXPATHLEN
 52            #else
 53            #define	PATH_MAX 1024
 54            #endif
 55            #endif
 56            
 57 dawes 3.0  	/*
 58            	 * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
 59            	 * relative to the top-level XKB configuration directory.
 60            	 * Making the server write to a subdirectory of that directory
 61            	 * requires some work in the general case (install procedure
 62            	 * has to create links to /var or somesuch on many machines),
 63            	 * so we just compile into /usr/tmp for now.
 64            	 */
 65            #ifndef XKM_OUTPUT_DIR
 66 dawes 3.3  #define	XKM_OUTPUT_DIR	"compiled/"
 67 dawes 3.0  #endif
 68 dawes 1.1  
 69 dawes 3.10 #define	PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
 70 dawes 1.1  #define	ERROR_PREFIX	"\"> \""
 71            #define	POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
 72            #define	POST_ERROR_MSG2 "\"End of messages from xkbcomp\""
 73            
 74 dawes 3.10 static void
 75 dawes 3.31 OutputDirectory(
 76                char* outdir)
 77 dawes 3.10 {
 78 dawes 3.15 #ifndef WIN32
 79 hohndel 3.21     if (getuid() == 0) {
 80              	/* if server running as root it *may* be able to write */
 81              	/* FIXME: check whether directory is writable at all */
 82 dawes   3.10 	(void) strcpy (outdir, XKM_OUTPUT_DIR);
 83 dawes   3.15     } else
 84              #endif
 85                  {
 86 dawes   3.10 #ifdef _PATH_VARTMP
 87              	(void) strcpy (outdir, _PATH_VARTMP);
 88 dawes   3.20 	if (outdir[strlen(outdir) - 1] != '/')	/* Hi IBM, Digital */
 89 dawes   3.10 	    (void) strcat (outdir, "/");
 90              #else
 91              	(void) strcpy (outdir, "/tmp/");
 92              #endif
 93                  }
 94              }
 95              
 96 dawes   1.1  Bool
 97 dawes   3.0  #if NeedFunctionPrototypes
 98              XkbDDXCompileNamedKeymap(	XkbDescPtr		xkb,
 99              				XkbComponentNamesPtr	names,
100              				char *			nameRtrn,
101              				int			nameRtrnLen)
102              #else
103 dawes   1.1  XkbDDXCompileNamedKeymap(xkb,names,nameRtrn,nameRtrnLen)
104                  XkbDescPtr			xkb;
105                  XkbComponentNamesPtr	names;
106                  char *			nameRtrn;
107                  int				nameRtrnLen;
108 dawes   3.0  #endif
109 dawes   1.1  {
110 dawes   3.9  char 	cmd[PATH_MAX],file[PATH_MAX],xkm_output_dir[PATH_MAX],*map,*outFile;
111 dawes   1.1  
112                  if (names->keymap==NULL)
113              	return False;
114                  strncpy(file,names->keymap,PATH_MAX); file[PATH_MAX-1]= '\0';
115                  if ((map= strrchr(file,'('))!=NULL) {
116              	char *tmp;
117              	if ((tmp= strrchr(map,')'))!=NULL) {
118              	    *map++= '\0';
119              	    *tmp= '\0';
120              	}
121              	else {
122              	    map= NULL;
123              	}
124                  }
125                  if ((outFile= strrchr(file,'/'))!=NULL)
126              	 outFile= _XkbDupString(&outFile[1]);
127                  else outFile= _XkbDupString(file);
128                  XkbEnsureSafeMapName(outFile);
129 dawes   3.10     OutputDirectory(xkm_output_dir);
130 dawes   3.19 
131 dawes   1.1      if (XkbBaseDirectory!=NULL) {
132 dawes   3.30 #ifdef __UNIXOS2__
133 dawes   3.16         char *tmpbase = (char*)__XOS2RedirRoot(XkbBaseDirectory);
134                      int i;
135 dawes   3.19 	if (strlen(tmpbase)*2+(xkbDebugFlags>9?2:1)
136              #else
137              	if (strlen(XkbBaseDirectory)*2+(xkbDebugFlags>9?2:1)
138 dawes   3.16 #endif
139 dawes   3.10 		+(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
140              		+strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
141              		+strlen(file)+strlen(xkm_output_dir)
142              		+strlen(outFile)+53 > PATH_MAX)
143              	{
144              	    ErrorF("compiler command for keymap (%s) exceeds max length\n",
145              								names->keymap);
146              	    return False;
147              	}
148 dawes   3.30 #ifndef __UNIXOS2__
149 dawes   3.3  	sprintf(cmd,"%s/xkbcomp -w %d -R%s -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s %s%s.xkm",
150 dawes   1.1  		XkbBaseDirectory,
151 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
152 dawes   1.1  		XkbBaseDirectory,(map?"-m ":""),(map?map:""),
153 dawes   3.0  		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
154 dawes   3.9  		xkm_output_dir,outFile);
155 dawes   3.16 #else
156              	for (i=0; i<strlen(tmpbase); i++) if (tmpbase[i]=='/') tmpbase[i]='\\';
157              	sprintf(cmd,"%s\\xkbcomp -w %d -R%s -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s %s%s.xkm",
158              		tmpbase,
159 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
160 dawes   3.19 		tmpbase,(map?"-m ":""),(map?map:""),
161 dawes   3.16 		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
162              		xkm_output_dir,outFile);
163              	ErrorF("Command line for XKB is %s\n",cmd);
164              #endif
165 dawes   1.1      }
166                  else {
167 dawes   3.10 	if ((xkbDebugFlags>9?2:1)+(map?strlen(map)+3:0)+strlen(PRE_ERROR_MSG)
168              		+strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
169              		+strlen(file)+strlen(xkm_output_dir)
170              		+strlen(outFile)+49 > PATH_MAX)
171              	{
172                          ErrorF("compiler command for keymap (%s) exceeds max length\n",
173              							names->keymap);
174              	    return False;
175              	}
176 dawes   3.3  	sprintf(cmd,"xkbcomp -w %d -xkm %s%s -em1 %s -emp %s -eml %s keymap/%s %s%s.xkm",
177 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
178 dawes   1.1  		(map?"-m ":""),(map?map:""),
179 dawes   3.0  		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,file,
180 dawes   3.9  		xkm_output_dir,outFile);
181 dawes   1.1      }
182              #ifdef DEBUG
183                  if (xkbDebugFlags) {
184              	ErrorF("XkbDDXCompileNamedKeymap compiling keymap using:\n");
185              	ErrorF("    \"cmd\"\n");
186                  }
187              #endif
188 dawes   3.22     if (System(cmd)==0) {
189 dawes   1.1  	if (nameRtrn) {
190              	    strncpy(nameRtrn,outFile,nameRtrnLen);
191              	    nameRtrn[nameRtrnLen-1]= '\0';
192              	}
193              	if (outFile!=NULL)
194 dawes   3.13 	    _XkbFree(outFile);
195 dawes   1.1  	return True;
196                  } 
197              #ifdef DEBUG
198                  ErrorF("Error compiling keymap (%s)\n",names->keymap);
199              #endif
200                  if (outFile!=NULL)
201 dawes   3.13 	_XkbFree(outFile);
202 dawes   1.1      return False;
203              }
204                      	
205              Bool    	
206 dawes   3.0  #if NeedFunctionPrototypes
207              XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
208              				XkbComponentNamesPtr	names,
209              				unsigned		want,
210              				unsigned		need,
211              				char *			nameRtrn,
212              				int			nameRtrnLen)
213              #else
214 dawes   1.1  XkbDDXCompileKeymapByNames(xkb,names,want,need,nameRtrn,nameRtrnLen)
215                  XkbDescPtr			xkb;
216                  XkbComponentNamesPtr	names;
217                  unsigned			want;
218                  unsigned			need;
219                  char *			nameRtrn;
220                  int				nameRtrnLen;
221 dawes   3.0  #endif
222 dawes   1.1  {
223              FILE *	out;
224 dawes   3.10 char	buf[PATH_MAX],keymap[PATH_MAX],xkm_output_dir[PATH_MAX];
225 dawes   3.15 #ifdef WIN32
226              char tmpname[32];
227              #endif    
228 dawes   3.30 #ifdef __UNIXOS2__
229 dawes   3.16 char *tmpbase;
230 dawes   3.18 int i;
231 dawes   3.16 #endif
232 dawes   1.1      if ((names->keymap==NULL)||(names->keymap[0]=='\0')) {
233              	sprintf(keymap,"server-%s",display);
234                  }
235                  else {
236 dawes   3.25 	if (strlen(names->keymap) > PATH_MAX - 1) {
237              	    ErrorF("name of keymap (%s) exceeds max length\n", names->keymap);
238              	    return False;
239              	}
240 dawes   1.1  	strcpy(keymap,names->keymap);
241                  }
242              
243                  XkbEnsureSafeMapName(keymap);
244 dawes   3.10     OutputDirectory(xkm_output_dir);
245 dawes   3.15 #ifdef WIN32
246                  strcpy(tmpname, "\\temp\\xkb_XXXXXX");
247                  (void) mktemp(tmpname);
248              #endif
249 dawes   3.30 #ifdef __UNIXOS2__
250 dawes   3.18     tmpbase = (char*)__XOS2RedirRoot(XkbBaseDirectory);
251 dawes   3.16 #endif
252 dawes   1.1      if (XkbBaseDirectory!=NULL) {
253 dawes   3.10 	if (strlen(XkbBaseDirectory)*2+(xkbDebugFlags>9?2:1)
254              		+strlen(PRE_ERROR_MSG)+strlen(ERROR_PREFIX)
255              		+strlen(POST_ERROR_MSG1)+strlen(xkm_output_dir)
256              		+strlen(keymap)+48 > PATH_MAX)
257              	{
258                          ErrorF("compiler command for keymap (%s) exceeds max length\n",
259              							names->keymap);
260              	    return False;
261              	}
262 dawes   3.15 #ifndef WIN32
263 dawes   3.30 #ifndef __UNIXOS2__
264 dawes   3.15 	sprintf(buf,
265              	   "%s/xkbcomp -w %d -R%s -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
266              		XkbBaseDirectory,
267 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
268 dawes   3.15 		XkbBaseDirectory,
269              		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
270              		xkm_output_dir,keymap);
271 dawes   3.16 #else
272              	for (i=0; i<strlen(tmpbase); i++) if (tmpbase[i]=='/') tmpbase[i]='\\';
273              	sprintf(buf,
274              	  "%s\\xkbcomp -w %d -R%s -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
275              		tmpbase,
276 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
277 dawes   3.16 		tmpbase,
278              		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
279              		xkm_output_dir,keymap);
280              #endif
281 dawes   3.6  #else
282 dawes   3.15 	sprintf(buf,
283                    "%s/xkbcomp -w %d -R%s -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\" < %s",
284 dawes   1.1  		XkbBaseDirectory,
285 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
286 dawes   1.1  		XkbBaseDirectory,
287 dawes   3.15 		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
288              		xkm_output_dir,keymap,tmpname);
289 dawes   3.6  #endif
290 dawes   1.1      }
291                  else {
292 dawes   3.10 	if ((xkbDebugFlags>9?2:1)+strlen(PRE_ERROR_MSG)
293              		+strlen(ERROR_PREFIX)+strlen(POST_ERROR_MSG1)
294              		+strlen(xkm_output_dir)+strlen(keymap)+44 > PATH_MAX)
295              	{
296                          ErrorF("compiler command for keymap (%s) exceeds max length\n",
297              							names->keymap);
298              	    return False;
299              	}
300 dawes   3.15 #ifndef WIN32
301              	sprintf(buf,
302              		"xkbcomp -w %d -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\"",
303 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
304 dawes   3.15 		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
305              		xkm_output_dir,keymap);
306              #else
307              	sprintf(buf,
308              	      "xkbcomp -w %d -xkm - -em1 %s -emp %s -eml %s \"%s%s.xkm\" < %s",
309 dawes   3.24 		((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:(int)xkbDebugFlags)),
310 dawes   3.15 		PRE_ERROR_MSG,ERROR_PREFIX,POST_ERROR_MSG1,
311              		xkm_output_dir,keymap,tmpname);
312              #endif
313 dawes   1.1      }
314 dawes   3.15 #ifndef WIN32
315 dawes   3.22     out= Popen(buf,"w");
316 dawes   3.15 #else
317                  out= fopen(tmpname, "w");
318              #endif
319 dawes   1.1      if (out!=NULL) {
320              #ifdef DEBUG
321 dawes   3.10     if (xkbDebugFlags) {
322                     ErrorF("XkbDDXCompileKeymapByNames compiling keymap:\n");
323                     XkbWriteXKBKeymapForNames(stderr,names,NULL,xkb,want,need);
324                  }
325 dawes   1.1  #endif
326              	XkbWriteXKBKeymapForNames(out,names,NULL,xkb,want,need);
327 dawes   3.15 #ifndef WIN32
328 dawes   3.22 	if (Pclose(out)==0)
329 dawes   3.15 #else
330              	if (fclose(out)==0)
331              #endif
332              	{
333              #ifdef WIN32
334 dawes   3.22 	    if (System(buf) < 0)
335 dawes   3.15 		ErrorF("Could not invoke keymap compiler\n");
336              	    else {
337              #endif
338 dawes   1.1  	    if (nameRtrn) {
339              		strncpy(nameRtrn,keymap,nameRtrnLen);
340              		nameRtrn[nameRtrnLen-1]= '\0';
341              	    }
342 dawes   3.23 #if defined(Lynx) && defined(__i386__) && defined(NEED_POPEN_WORKAROUND)
343 dawes   3.12 	/* somehow popen/pclose is broken on LynxOS AT 2.3.0/2.4.0!
344              	 * the problem usually shows up with XF86Setup
345              	 * this hack waits at max 5 seconds after pclose() returns
346              	 * for the output of the xkbcomp output file.
347              	 * I didn't manage to get a patch in time for the 3.2 release
348              	 */
349                          {
350              		int i;
351              		char name[PATH_MAX];
352 dawes   3.23                 if (XkbBaseDirectory!=NULL)
353              		    sprintf(name,"%s/%s%s.xkm", XkbBaseDirectory
354              			,xkm_output_dir, keymap);
355              		else
356                                  sprintf(name,"%s%s.xkm", xkm_output_dir, keymap);
357 dawes   3.12 		for (i = 0; i < 10; i++) {
358              	            if (access(name, 0) == 0) break;
359              		    usleep(500000);
360              		}
361              #ifdef DEBUG
362              		if (i) ErrorF(">>>> Waited %d times for %s\n", i, name);
363              #endif
364              	    }
365              #endif
366 dawes   1.1  	    return True;
367 dawes   3.15 #ifdef WIN32
368              	    }
369              #endif
370 dawes   1.1  	}
371              #ifdef DEBUG
372 dawes   3.15 	else
373              	    ErrorF("Error compiling keymap (%s)\n",keymap);
374 dawes   1.1  #endif
375                  }
376              #ifdef DEBUG
377                  else {
378 dawes   3.15 #ifndef WIN32
379 dawes   1.1  	ErrorF("Could not invoke keymap compiler\n");
380 dawes   3.15 #else
381              	ErrorF("Could not open file %s\n", tmpname);
382              #endif
383 dawes   1.1      }
384              #endif
385                  if (nameRtrn)
386              	nameRtrn[0]= '\0';
387                  return False;
388              }
389              
390              FILE *
391 dawes   3.0  #if NeedFunctionPrototypes
392              XkbDDXOpenConfigFile(char *mapName,char *fileNameRtrn,int fileNameRtrnLen)
393              #else
394 dawes   1.1  XkbDDXOpenConfigFile(mapName,fileNameRtrn,fileNameRtrnLen)
395                  char *	mapName;
396                  char *	fileNameRtrn;
397                  int		fileNameRtrnLen;
398 dawes   3.0  #endif
399 dawes   1.1  {
400 dawes   3.10 char	buf[PATH_MAX],xkm_output_dir[PATH_MAX];
401 dawes   1.1  FILE *	file;
402              
403                  buf[0]= '\0';
404                  if (mapName!=NULL) {
405 dawes   3.10 	OutputDirectory(xkm_output_dir);
406              	if ((XkbBaseDirectory!=NULL)&&(xkm_output_dir[0]!='/')) {
407              	    if (strlen(XkbBaseDirectory)+strlen(xkm_output_dir)
408              		     +strlen(mapName)+6 <= PATH_MAX)
409              	    {
410              	        sprintf(buf,"%s/%s%s.xkm",XkbBaseDirectory,
411              					xkm_output_dir,mapName);
412              	    }
413              	}
414              	else if (strlen(xkm_output_dir)+strlen(mapName)+5 <= PATH_MAX)
415              	    sprintf(buf,"%s%s.xkm",xkm_output_dir,mapName);
416              	if (buf[0] != '\0')
417              	    file= fopen(buf,"r");
418              	else file= NULL;
419 dawes   1.1      }
420                  else file= NULL;
421                  if ((fileNameRtrn!=NULL)&&(fileNameRtrnLen>0)) {
422              	strncpy(fileNameRtrn,buf,fileNameRtrnLen);
423              	buf[fileNameRtrnLen-1]= '\0';
424                  }
425                  return file;
426              }
427              
428              unsigned
429 dawes   3.0  #if NeedFunctionPrototypes
430              XkbDDXLoadKeymapByNames(	DeviceIntPtr		keybd,
431              				XkbComponentNamesPtr	names,
432              				unsigned		want,
433              				unsigned		need,
434              				XkbFileInfo *		finfoRtrn,
435              				char *			nameRtrn,
436              				int 			nameRtrnLen)
437              #else
438 dawes   1.1  XkbDDXLoadKeymapByNames(keybd,names,want,need,finfoRtrn,nameRtrn,nameRtrnLen)
439                  DeviceIntPtr		keybd;
440                  XkbComponentNamesPtr	names;
441                  unsigned			want;
442                  unsigned			need;
443                  XkbFileInfo *		finfoRtrn;
444                  char *			nameRtrn;
445                  int 			nameRtrnLen;
446 dawes   3.0  #endif
447 dawes   1.1  {
448              XkbDescPtr	xkb;
449              FILE	*	file;
450              char		fileName[PATH_MAX];
451              unsigned	missing;
452              
453                  bzero(finfoRtrn,sizeof(XkbFileInfo));
454                  if ((keybd==NULL)||(keybd->key==NULL)||(keybd->key->xkbInfo==NULL))
455              	 xkb= NULL;
456                  else xkb= keybd->key->xkbInfo->desc;
457                  if ((names->keycodes==NULL)&&(names->types==NULL)&&
458              	(names->compat==NULL)&&(names->symbols==NULL)&&
459              	(names->geometry==NULL)) {
460              	if (names->keymap==NULL) {
461              	    bzero(finfoRtrn,sizeof(XkbFileInfo));
462              	    if (xkb && XkbDetermineFileType(finfoRtrn,XkbXKMFile,NULL) &&
463              	   				((finfoRtrn->defined&need)==need) ) {
464              		finfoRtrn->xkb= xkb;
465              		nameRtrn[0]= '\0';
466              		return finfoRtrn->defined;
467              	    }
468 dawes   1.1  	    return 0;
469              	}
470              	else if (!XkbDDXCompileNamedKeymap(xkb,names,nameRtrn,nameRtrnLen)) {
471              #ifdef NOISY
472              	    ErrorF("Couldn't compile keymap file\n");
473              #endif
474              	    return 0;
475              	}
476                  }
477                  else if (!XkbDDXCompileKeymapByNames(xkb,names,want,need,
478              						nameRtrn,nameRtrnLen)){
479              #ifdef NOISY
480              	ErrorF("Couldn't compile keymap file\n");
481              #endif
482              	return 0;
483                  }
484                  file= XkbDDXOpenConfigFile(nameRtrn,fileName,PATH_MAX);
485                  if (file==NULL) {
486              	ErrorF("Couldn't open compiled keymap file %s\n",fileName);
487              	return 0;
488                  }
489 dawes   1.1      missing= XkmReadFile(file,need,want,finfoRtrn);
490                  if (finfoRtrn->xkb==NULL) {
491              	ErrorF("Error loading keymap %s\n",fileName);
492              	fclose(file);
493 dawes   3.9  	(void) unlink (fileName);
494 dawes   1.1  	return 0;
495                  }
496              #ifdef DEBUG
497                  else if (xkbDebugFlags) {
498              	ErrorF("Loaded %s, defined=0x%x\n",fileName,finfoRtrn->defined);
499                  }
500              #endif
501                  fclose(file);
502 dawes   3.9      (void) unlink (fileName);
503 dawes   1.1      return (need|want)&(~missing);
504 dawes   3.10 }
505              
506              Bool
507              #if NeedFunctionPrototypes
508              XkbDDXNamesFromRules(	DeviceIntPtr		keybd,
509              			char *			rules_name,
510              			XkbRF_VarDefsPtr	defs,
511              			XkbComponentNamesPtr	names)
512              #else
513              XkbDDXNamesFromRules(keybd,rules_name,defs,names)
514                  DeviceIntPtr		keybd;
515                  char *			rules_name;
516                  XkbRF_VarDefsPtr		defs;
517                  XkbComponentNamesPtr	names;
518              #endif
519              {
520              char 		buf[PATH_MAX];
521              FILE *		file;
522              Bool		complete;
523              XkbRF_RulesPtr	rules;
524              
525 dawes   3.10     if (!rules_name)
526              	return False;
527                  if (XkbBaseDirectory==NULL) {
528              	if (strlen(rules_name)+7 > PATH_MAX)
529              	    return False;
530              	sprintf(buf,"rules/%s",rules_name);
531                  }
532                  else {
533              	if (strlen(XkbBaseDirectory)+strlen(rules_name)+8 > PATH_MAX)
534              	    return False;
535                      sprintf(buf,"%s/rules/%s",XkbBaseDirectory,rules_name);
536                  }
537                  if ((file= fopen(buf,"r"))==NULL)
538              	return False;
539                  if ((rules= XkbRF_Create(0,0))==NULL) {
540              	fclose(file);
541              	return False;
542                  }
543                  if (!XkbRF_LoadRules(file,rules)) {
544              	fclose(file);
545              	XkbRF_Free(rules,True);
546 dawes   3.10 	return False;
547                  }
548                  bzero((char *)names,sizeof(XkbComponentNamesRec));
549                  complete= XkbRF_GetComponents(rules,defs,names);
550                  fclose(file);
551                  XkbRF_Free(rules,True);
552                  return complete;
553 dawes   1.1  }
554 eich    3.29 
555              

Powered by
ViewCVS 0.9.2