xc/programs/Xserver/xkb/ddxList.c

//bugs.freedesktop.org/show_bug.cgi?id=2245) attachment #1647
    (https://bugs.freedesktop.org/attachment.cgi?id=1647): export
    Win32System and Win32TempDir remove #ifdef WIN32 block for building
    xkbcomp commandline create win32 tempfile in system tempdir use
    PATH_MAX*4 for commandline buffer unlink tmpfile again
This commit is contained in:
Alexander Gottwald 2005-01-09 17:35:47 +00:00
parent ba25f7e8dc
commit fe4e74241f
2 changed files with 41 additions and 32 deletions

View File

@ -49,6 +49,22 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#endif #endif
#endif #endif
#ifdef WIN32
/* from ddxLoad.c */
extern const char* Win32TempDir();
extern int Win32System(const char *cmdline);
#undef System
#define System Win32System
#define W32_tmparg " '%s'"
#define W32_tmpfile ,tmpname
#define W32_tmplen strlen(tmpname)+3
#else
#define W32_tmparg
#define W32_tmpfile
#define W32_tmplen 0
#endif
/***====================================================================***/ /***====================================================================***/
static char *componentDirs[_XkbListNumComponents] = { static char *componentDirs[_XkbListNumComponents] = {
@ -115,14 +131,14 @@ XkbDDXListComponent( DeviceIntPtr dev,
XkbSrvListInfoPtr list, XkbSrvListInfoPtr list,
ClientPtr client) ClientPtr client)
{ {
char *file,*map,*tmp,buf[PATH_MAX]; char *file,*map,*tmp,buf[PATH_MAX*4];
FILE *in; FILE *in;
Status status; Status status;
int rval; int rval;
Bool haveDir; Bool haveDir;
#ifdef WIN32 #ifdef WIN32
char tmpname[32]; char tmpname[PATH_MAX];
#endif #endif
if ((list->pattern[what]==NULL)||(list->pattern[what][0]=='\0')) if ((list->pattern[what]==NULL)||(list->pattern[what][0]=='\0'))
return Success; return Success;
@ -141,7 +157,8 @@ char tmpname[32];
in= NULL; in= NULL;
haveDir= True; haveDir= True;
#ifdef WIN32 #ifdef WIN32
strcpy(tmpname, "\\temp\\xkb_XXXXXX"); strcpy(tmpname, Win32TempDir());
strcat(tmpname, "\\xkb_XXXXXX");
(void) mktemp(tmpname); (void) mktemp(tmpname);
#endif #endif
if (XkbBaseDirectory!=NULL) { if (XkbBaseDirectory!=NULL) {
@ -154,19 +171,15 @@ char tmpname[32];
if (!in) { if (!in) {
haveDir= False; haveDir= False;
if (strlen(XkbBaseDirectory)*2+strlen(componentDirs[what]) if (strlen(XkbBaseDirectory)*2+strlen(componentDirs[what])
+(xkbDebugFlags>9?2:1)+strlen(file)+31 > PATH_MAX) +W32_tmplen
+(xkbDebugFlags>9?2:1)+strlen(file)+35 > PATH_MAX)
return BadImplementation; return BadImplementation;
#ifndef WIN32 sprintf(buf,
sprintf(buf,"%s/xkbcomp -R%s/%s -w %ld -l -vlfhpR '%s'", "'%s/xkbcomp' '-R%s/%s' -w %ld -l -vlfhpR '%s'" W32_tmparg,
XkbBaseDirectory,XkbBaseDirectory,componentDirs[what],(long) XkbBaseDirectory,XkbBaseDirectory,componentDirs[what],(long)
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)), ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
file); file W32_tmpfile
#else );
sprintf(buf,"%s/xkbcomp -R%s/%s -w %ld -l -vlfhpR '%s' %s",
XkbBaseDirectory,XkbBaseDirectory,componentDirs[what],(long)
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
file, tmpname);
#endif
} }
} }
else { else {
@ -178,37 +191,32 @@ char tmpname[32];
} }
if (!in) { if (!in) {
haveDir= False; haveDir= False;
if (strlen(componentDirs[what]) if (strlen(componentDirs[what]) + W32_tmplen
+(xkbDebugFlags>9?2:1)+strlen(file)+29 > PATH_MAX) +(xkbDebugFlags>9?2:1)+strlen(file)+29 > PATH_MAX)
return BadImplementation; return BadImplementation;
#ifndef WIN32 sprintf(buf,
sprintf(buf,"xkbcomp -R%s -w %ld -l -vlfhpR '%s'", "xkbcomp -R%s -w %ld -l -vlfhpR '%s'" W32_tmparg,
componentDirs[what],(long) componentDirs[what],(long)
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)), ((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
file); file W32_tmpfile
#else );
sprintf(buf,"xkbcomp -R%s -w %ld -l -vlfhpR '%s' %s",
componentDirs[what],(long)
((xkbDebugFlags<2)?1:((xkbDebugFlags>10)?10:xkbDebugFlags)),
file, tmpname);
#endif
} }
} }
status= Success; status= Success;
if (!haveDir) if (!haveDir)
{
#ifndef WIN32 #ifndef WIN32
in= Popen(buf,"r"); in= Popen(buf,"r");
#else #else
{
#ifdef DEBUG_CMD #ifdef DEBUG_CMD
ErrorF("xkb executes: %s\n",cmd); ErrorF("xkb executes: %s\n",buf);
#endif #endif
if (System(buf) < 0) if (System(buf) < 0)
ErrorF("Could not invoke keymap compiler\n"); ErrorF("Could not invoke keymap compiler\n");
else else
in= fopen(tmpname, "r"); in= fopen(tmpname, "r");
}
#endif #endif
}
if (!in) if (!in)
return BadImplementation; return BadImplementation;
list->nFound[what]= 0; list->nFound[what]= 0;
@ -262,6 +270,7 @@ char tmpname[32];
} }
#else #else
fclose(in); fclose(in);
unlink(tmpname);
#endif #endif
return status; return status;
} }

View File

@ -71,7 +71,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\"" #define POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
#define POST_ERROR_MSG2 "\"End of messages from xkbcomp\"" #define POST_ERROR_MSG2 "\"End of messages from xkbcomp\""
#ifdef __UNIXOS2__ #if defined(__UNIXOS2__) || defined(WIN32)
#define PATHSEPARATOR "\\" #define PATHSEPARATOR "\\"
#else #else
#define PATHSEPARATOR "/" #define PATHSEPARATOR "/"
@ -80,7 +80,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#ifdef WIN32 #ifdef WIN32
#include <Xwindows.h> #include <Xwindows.h>
static const char* const char*
Win32TempDir() Win32TempDir()
{ {
static char buffer[PATH_MAX]; static char buffer[PATH_MAX];
@ -102,7 +102,7 @@ Win32TempDir()
return "/tmp"; return "/tmp";
} }
static int int
Win32System(const char *cmdline) Win32System(const char *cmdline)
{ {
STARTUPINFO si; STARTUPINFO si;