mirror of
https://github.com/Stichting-MINIX-Research-Foundation/xsrc.git
synced 2025-09-10 13:22:52 -04:00
634 lines
18 KiB
C
634 lines
18 KiB
C
/* $Xorg: Error.c,v 1.5 2001/02/09 02:03:54 xorgcvs Exp $ */
|
|
|
|
/***********************************************************
|
|
Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts
|
|
Copyright 1993 by Sun Microsystems, Inc. Mountain View, CA.
|
|
|
|
All Rights Reserved
|
|
|
|
Permission to use, copy, modify, and distribute this software and its
|
|
documentation for any purpose and without fee is hereby granted,
|
|
provided that the above copyright notice appear in all copies and that
|
|
both that copyright notice and this permission notice appear in
|
|
supporting documentation, and that the names of Digital or Sun not be
|
|
used in advertising or publicity pertaining to distribution of the
|
|
software without specific, written prior permission.
|
|
|
|
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
|
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
SOFTWARE.
|
|
|
|
SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
|
|
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI-
|
|
ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
|
|
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
|
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
|
THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
******************************************************************/
|
|
/* $XFree86: xc/lib/Xt/Error.c,v 3.15 2004/05/05 00:07:03 dickey Exp $ */
|
|
|
|
/*
|
|
|
|
Copyright 1987, 1988, 1998 The Open Group
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software and its
|
|
documentation for any purpose is hereby granted without fee, provided that
|
|
the above copyright notice appear in all copies and that both that
|
|
copyright notice and this permission notice appear in supporting
|
|
documentation.
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of The Open Group shall not be
|
|
used in advertising or otherwise to promote the sale, use or other dealings
|
|
in this Software without prior written authorization from The Open Group.
|
|
|
|
*/
|
|
|
|
#include "IntrinsicI.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
/* The error handlers in the application context aren't used since we can't
|
|
come up with a uniform way of using them. If you can, define
|
|
GLOBALERRORS to be FALSE (or 0). */
|
|
|
|
#ifndef GLOBALERRORS
|
|
#define GLOBALERRORS 1
|
|
#endif
|
|
|
|
static void InitErrorHandling(XrmDatabase *);
|
|
#if GLOBALERRORS
|
|
static XrmDatabase errorDB = NULL;
|
|
static Boolean error_inited = FALSE;
|
|
void _XtDefaultErrorMsg(String, String, String, String, String*, Cardinal*);
|
|
void _XtDefaultWarningMsg(String, String, String, String, String*, Cardinal*);
|
|
void _XtDefaultError(String);
|
|
void _XtDefaultWarning(String);
|
|
static XtErrorMsgHandler errorMsgHandler = _XtDefaultErrorMsg;
|
|
static XtErrorMsgHandler warningMsgHandler = _XtDefaultWarningMsg;
|
|
static XtErrorHandler errorHandler = _XtDefaultError;
|
|
static XtErrorHandler warningHandler = _XtDefaultWarning;
|
|
#endif /* GLOBALERRORS */
|
|
|
|
XrmDatabase *XtGetErrorDatabase(void)
|
|
{
|
|
XrmDatabase* retval;
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
retval = &errorDB;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
retval = XtAppGetErrorDatabase(_XtDefaultAppContext());
|
|
#endif /* GLOBALERRORS */
|
|
return retval;
|
|
}
|
|
|
|
XrmDatabase *XtAppGetErrorDatabase(
|
|
XtAppContext app)
|
|
{
|
|
XrmDatabase* retval;
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
retval = &errorDB;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
retval= &app->errorDB;
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
return retval;
|
|
}
|
|
|
|
void XtGetErrorDatabaseText(
|
|
register _Xconst char* name,
|
|
register _Xconst char* type,
|
|
register _Xconst char* class,
|
|
_Xconst char* defaultp,
|
|
String buffer,
|
|
int nbytes)
|
|
{
|
|
#if GLOBALERRORS
|
|
XtAppGetErrorDatabaseText(NULL,
|
|
name,type,class,defaultp, buffer, nbytes, NULL);
|
|
#else
|
|
XtAppGetErrorDatabaseText(_XtDefaultAppContext(),
|
|
name,type,class,defaultp, buffer, nbytes, NULL);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtAppGetErrorDatabaseText(
|
|
XtAppContext app,
|
|
register _Xconst char* name,
|
|
register _Xconst char* type,
|
|
register _Xconst char* class,
|
|
_Xconst char* defaultp,
|
|
String buffer,
|
|
int nbytes,
|
|
XrmDatabase db)
|
|
{
|
|
String str_class;
|
|
String type_str;
|
|
XrmValue result;
|
|
char *str_name = NULL;
|
|
char *temp = NULL;
|
|
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
if (error_inited == FALSE) {
|
|
InitErrorHandling (&errorDB);
|
|
error_inited = TRUE;
|
|
}
|
|
#else
|
|
LOCK_APP(app);
|
|
if (app->error_inited == FALSE) {
|
|
InitErrorHandling (&app->errorDB);
|
|
app->error_inited = TRUE;
|
|
}
|
|
#endif /* GLOBALERRORS */
|
|
if (!(str_name = ALLOCATE_LOCAL(strlen(name) + strlen(type) + 2)))
|
|
_XtAllocError(NULL);
|
|
(void) sprintf(str_name, "%s.%s", name, type);
|
|
/* XrmGetResource requires the name and class to be fully qualified
|
|
* and to have the same number of components. */
|
|
str_class = (char *)class;
|
|
if (! strchr(class, '.')) {
|
|
if (!(temp = ALLOCATE_LOCAL(2 * strlen(class) + 2)))
|
|
_XtAllocError(NULL);
|
|
(void) sprintf(temp, "%s.%s", class, class);
|
|
str_class = temp;
|
|
}
|
|
if (db == NULL) {
|
|
#if GLOBALERRORS
|
|
(void) XrmGetResource(errorDB, str_name, str_class, &type_str,
|
|
&result);
|
|
#else
|
|
(void) XrmGetResource(app->errorDB, str_name, str_class, &type_str,
|
|
&result);
|
|
#endif /* GLOBALERRORS */
|
|
} else (void) XrmGetResource(db, str_name, str_class, &type_str, &result);
|
|
if (result.addr) {
|
|
(void) strncpy (buffer, result.addr, nbytes);
|
|
if (result.size > (unsigned) nbytes) buffer[nbytes-1] = 0;
|
|
} else {
|
|
int len = strlen(defaultp);
|
|
if (len >= nbytes) len = nbytes-1;
|
|
(void) memmove(buffer, defaultp, len);
|
|
buffer[len] = '\0';
|
|
}
|
|
if (str_name)
|
|
DEALLOCATE_LOCAL(str_name);
|
|
if (temp)
|
|
DEALLOCATE_LOCAL(temp);
|
|
#if GLOBALERRORS
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
UNLOCK_APP(app);
|
|
#endif
|
|
}
|
|
|
|
static void InitErrorHandling (
|
|
XrmDatabase *db)
|
|
{
|
|
XrmDatabase errordb;
|
|
|
|
errordb = XrmGetFileDatabase(ERRORDB);
|
|
XrmMergeDatabases(errordb, db);
|
|
}
|
|
|
|
static void DefaultMsg (
|
|
String name,
|
|
String type,
|
|
String class,
|
|
String defaultp,
|
|
String* params,
|
|
Cardinal* num_params,
|
|
Bool error,
|
|
void (*fn)(_Xconst _XtString))
|
|
{
|
|
#define BIGBUF 1024
|
|
#ifdef notyet /* older versions don't, might want to wait until more do */
|
|
#if defined(__linux__) || defined(CSRG_BASED) /* everyone else needs to get with the program */
|
|
#define USE_SNPRINTF
|
|
#endif
|
|
#endif
|
|
char buffer[BIGBUF];
|
|
char* message;
|
|
XtGetErrorDatabaseText(name,type,class,defaultp, buffer, BIGBUF);
|
|
/*need better solution here, perhaps use lower level printf primitives? */
|
|
if (params == NULL || num_params == NULL || *num_params == 0)
|
|
(*fn)(buffer);
|
|
#ifndef WIN32 /* and OS/2 */
|
|
else if ((getuid () != geteuid ()) || getuid() == 0) {
|
|
if ((error && errorHandler == _XtDefaultError) ||
|
|
(!error && warningHandler == _XtDefaultWarning)) {
|
|
/*
|
|
* if it's just going to go to stderr anyway, then we'll
|
|
* fprintf to stderr ourselves and skip the insecure sprintf.
|
|
*/
|
|
Cardinal i = *num_params;
|
|
String par[10];
|
|
if (i > 10) i = 10;
|
|
(void) memmove((char*)par, (char*)params, i * sizeof(String) );
|
|
bzero( &par[i], (10-i) * sizeof(String) );
|
|
(void) fprintf (stderr, "%s%s",
|
|
error ? XTERROR_PREFIX : XTWARNING_PREFIX,
|
|
error ? "Error: " : "Warning: ");
|
|
(void) fprintf (stderr, buffer,
|
|
par[0], par[1], par[2], par[3], par[4],
|
|
par[5], par[6], par[7], par[8], par[9]);
|
|
(void) fprintf (stderr, "%c", '\n');
|
|
if (i != *num_params)
|
|
(*fn) ( "Some arguments in previous message were lost" );
|
|
else if (error) exit (1);
|
|
} else {
|
|
/*
|
|
* can't tell what it might do, so we'll play it safe
|
|
*/
|
|
XtWarning ("\
|
|
This program is an suid-root program or is being run by the root user.\n\
|
|
The full text of the error or warning message cannot be safely formatted\n\
|
|
in this environment. You may get a more descriptive message by running the\n\
|
|
program as a non-root user or by removing the suid bit on the executable.");
|
|
(*fn)(buffer); /* if *fn is an ErrorHandler it should exit */
|
|
}
|
|
}
|
|
#endif
|
|
else {
|
|
/*
|
|
* If you have snprintf the worst thing that could happen is you'd
|
|
* lose some information. Without snprintf you're probably going to
|
|
* scramble your heap and perhaps SEGV -- sooner or later.
|
|
* If it hurts when you go like this then don't go like this! :-)
|
|
*/
|
|
Cardinal i = *num_params;
|
|
String par[10];
|
|
if (i > 10) i = 10;
|
|
(void) memmove((char*)par, (char*)params, i * sizeof(String) );
|
|
bzero( &par[i], (10-i) * sizeof(String) );
|
|
if (i != *num_params)
|
|
XtWarning( "Some arguments in following message were lost" );
|
|
/*
|
|
* resist any temptation you might have to make `message' a
|
|
* local buffer on the stack. Doing so is a security hole
|
|
* in programs executing as root. Error and Warning
|
|
* messages shouldn't be called frequently enough for this
|
|
* to be a performance issue.
|
|
*/
|
|
if ((message = __XtMalloc (BIGBUF))) {
|
|
#ifndef USE_SNPRINTF
|
|
message[BIGBUF-1] = 0;
|
|
(void) sprintf (message, buffer,
|
|
#else
|
|
(void) snprintf (message, BIGBUF, buffer,
|
|
#endif
|
|
par[0], par[1], par[2], par[3], par[4],
|
|
par[5], par[6], par[7], par[8], par[9]);
|
|
#ifndef USE_SNPRINTF
|
|
if (message[BIGBUF-1] != '\0')
|
|
XtWarning ("Possible heap corruption in Xt{Error,Warning}MsgHandler");
|
|
#endif
|
|
(*fn)(message);
|
|
XtFree(message);
|
|
} else {
|
|
XtWarning ("Memory allocation failed, arguments in the following message were lost");
|
|
(*fn)(buffer);
|
|
}
|
|
}
|
|
}
|
|
|
|
void _XtDefaultErrorMsg (
|
|
String name,
|
|
String type,
|
|
String class,
|
|
String defaultp,
|
|
String* params,
|
|
Cardinal* num_params)
|
|
{
|
|
DefaultMsg (name,type,class,defaultp,params,num_params,True,XtError);
|
|
}
|
|
|
|
void _XtDefaultWarningMsg (
|
|
String name,
|
|
String type,
|
|
String class,
|
|
String defaultp,
|
|
String* params,
|
|
Cardinal* num_params)
|
|
{
|
|
DefaultMsg (name,type,class,defaultp,params,num_params,False,XtWarning);
|
|
}
|
|
|
|
void XtErrorMsg(
|
|
_Xconst char* name,
|
|
_Xconst char* type,
|
|
_Xconst char* class,
|
|
_Xconst char* defaultp,
|
|
String* params,
|
|
Cardinal* num_params)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*errorMsgHandler)((String)name,(String)type,(String)class,
|
|
(String)defaultp,params,num_params);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppErrorMsg(_XtDefaultAppContext(),name,type,class,
|
|
defaultp,params,num_params);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtAppErrorMsg(
|
|
XtAppContext app,
|
|
_Xconst char* name,
|
|
_Xconst char* type,
|
|
_Xconst char* class,
|
|
_Xconst char* defaultp,
|
|
String* params,
|
|
Cardinal* num_params)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*errorMsgHandler)((String)name,(String)type,(String)class,
|
|
(String)defaultp,params,num_params);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
(*app->errorMsgHandler)(name,type,class,defaultp,params,num_params);
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtWarningMsg(
|
|
_Xconst char* name,
|
|
_Xconst char* type,
|
|
_Xconst char* class,
|
|
_Xconst char* defaultp,
|
|
String* params,
|
|
Cardinal* num_params)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*warningMsgHandler)((String)name,(String)type,(String)class,
|
|
(String)defaultp,params,num_params);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppWarningMsg(_XtDefaultAppContext(),name,type,class,
|
|
defaultp,params,num_params);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtAppWarningMsg(
|
|
XtAppContext app,
|
|
_Xconst char* name,
|
|
_Xconst char* type,
|
|
_Xconst char* class,
|
|
_Xconst char* defaultp,
|
|
String* params,
|
|
Cardinal* num_params)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*warningMsgHandler)((String)name,(String)type,(String)class,
|
|
(String)defaultp,params,num_params);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
(*app->warningMsgHandler)(name,type,class,defaultp,params,num_params);
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtSetErrorMsgHandler(
|
|
XtErrorMsgHandler handler)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
if (handler != NULL) errorMsgHandler = handler;
|
|
else errorMsgHandler = _XtDefaultErrorMsg;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppSetErrorMsgHandler(_XtDefaultAppContext(), handler);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
XtErrorMsgHandler XtAppSetErrorMsgHandler(
|
|
XtAppContext app,
|
|
XtErrorMsgHandler handler)
|
|
{
|
|
XtErrorMsgHandler old;
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
old = errorMsgHandler;
|
|
if (handler != NULL) errorMsgHandler = handler;
|
|
else errorMsgHandler = _XtDefaultErrorMsg;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
old = app->errorMsgHandler;
|
|
if (handler != NULL) app->errorMsgHandler = handler;
|
|
else app->errorMsgHandler = _XtDefaultErrorMsg;
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
return old;
|
|
}
|
|
|
|
void XtSetWarningMsgHandler(
|
|
XtErrorMsgHandler handler)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
if (handler != NULL) warningMsgHandler = handler;
|
|
else warningMsgHandler = _XtDefaultWarningMsg;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppSetWarningMsgHandler(_XtDefaultAppContext(),handler);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
XtErrorMsgHandler XtAppSetWarningMsgHandler(
|
|
XtAppContext app,
|
|
XtErrorMsgHandler handler)
|
|
{
|
|
XtErrorMsgHandler old;
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
old = warningMsgHandler;
|
|
if (handler != NULL) warningMsgHandler = handler;
|
|
else warningMsgHandler = _XtDefaultWarningMsg;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
old = app->warningMsgHandler;
|
|
if (handler != NULL) app->warningMsgHandler = handler;
|
|
else app->warningMsgHandler = _XtDefaultWarningMsg;
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
return old;
|
|
}
|
|
|
|
void _XtDefaultError(String message)
|
|
{
|
|
if (message && *message)
|
|
(void)fprintf(stderr, "%sError: %s\n", XTERROR_PREFIX, message);
|
|
exit(1);
|
|
}
|
|
|
|
void _XtDefaultWarning(String message)
|
|
{
|
|
if (message && *message)
|
|
(void)fprintf(stderr, "%sWarning: %s\n", XTWARNING_PREFIX, message);
|
|
return;
|
|
}
|
|
|
|
void XtError(
|
|
_Xconst char* message)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*errorHandler)((String)message);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppError(_XtDefaultAppContext(),message);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtAppError(
|
|
XtAppContext app,
|
|
_Xconst char* message)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*errorHandler)((String)message);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
(*app->errorHandler)(message);
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtWarning(
|
|
_Xconst char* message)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*warningHandler)((String)message);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppWarning(_XtDefaultAppContext(),message);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtAppWarning(
|
|
XtAppContext app,
|
|
_Xconst char* message)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
(*warningHandler)((String)message);
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
(*app->warningHandler)(message);
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
void XtSetErrorHandler(XtErrorHandler handler)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
if (handler != NULL) errorHandler = handler;
|
|
else errorHandler = _XtDefaultError;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppSetErrorHandler(_XtDefaultAppContext(),handler);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
XtErrorHandler XtAppSetErrorHandler(
|
|
XtAppContext app,
|
|
XtErrorHandler handler)
|
|
{
|
|
XtErrorHandler old;
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
old = errorHandler;
|
|
if (handler != NULL) errorHandler = handler;
|
|
else errorHandler = _XtDefaultError;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
old = app->errorHandler;
|
|
if (handler != NULL) app->errorHandler = handler;
|
|
else app->errorHandler = _XtDefaultError;
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
return old;
|
|
}
|
|
|
|
void XtSetWarningHandler(XtErrorHandler handler)
|
|
{
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
if (handler != NULL) warningHandler = handler;
|
|
else warningHandler = _XtDefaultWarning;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
XtAppSetWarningHandler(_XtDefaultAppContext(),handler);
|
|
#endif /* GLOBALERRORS */
|
|
}
|
|
|
|
XtErrorHandler XtAppSetWarningHandler(
|
|
XtAppContext app,
|
|
XtErrorHandler handler)
|
|
{
|
|
XtErrorHandler old;
|
|
#if GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
old = warningHandler;
|
|
if (handler != NULL) warningHandler = handler;
|
|
else warningHandler = _XtDefaultWarning;
|
|
UNLOCK_PROCESS;
|
|
#else
|
|
LOCK_APP(app);
|
|
old = app->warningHandler;
|
|
if (handler != NULL) app->warningHandler = handler;
|
|
else app->warningHandler = _XtDefaultWarning;
|
|
UNLOCK_APP(app);
|
|
#endif /* GLOBALERRORS */
|
|
return old;
|
|
}
|
|
|
|
void _XtSetDefaultErrorHandlers(
|
|
XtErrorMsgHandler *errMsg,
|
|
XtErrorMsgHandler *warnMsg,
|
|
XtErrorHandler *err,
|
|
XtErrorHandler *warn)
|
|
{
|
|
#ifndef GLOBALERRORS
|
|
LOCK_PROCESS;
|
|
*errMsg = _XtDefaultErrorMsg;
|
|
*warnMsg = _XtDefaultWarningMsg;
|
|
*err = _XtDefaultError;
|
|
*warn = _XtDefaultWarning;
|
|
UNLOCK_PROCESS;
|
|
#endif /* GLOBALERRORS */
|
|
}
|