mirror of
https://github.com/envmodules/modules.git
synced 2026-06-10 00:56:30 +08:00
fly, as it were. It's a powerful mechanism for dynamically changing environment variables, aliases, X11 resources, etc. It uses an embedded Tcl intrepretor, with a few extensions. Therefore, it has a well defined language syntax. Version 3.1 is GPL, and includes many improvements over the 3.0beta.
234 lines
6.7 KiB
C
234 lines
6.7 KiB
C
/*****
|
||
** ** Module Header ******************************************************* **
|
||
** **
|
||
** Modules Revision 3.0 **
|
||
** Providing a flexible user environment **
|
||
** **
|
||
** File: cmdLog.c **
|
||
** First Edition: 95/12/26 **
|
||
** **
|
||
** Authors: Jens Hamisch, jens@Strawberry.COM **
|
||
** **
|
||
** Description: The Tcl module-trace routine which provides a con- **
|
||
** trolling interface to the modulecmd tracing feature **
|
||
** **
|
||
** Exports: cmdModuleLog **
|
||
** **
|
||
** Notes: **
|
||
** **
|
||
** ************************************************************************ **
|
||
****/
|
||
|
||
/** ** Copyright *********************************************************** **
|
||
** **
|
||
** Copyright 1991-1994 by John L. Furlan. **
|
||
** see LICENSE.GPL, which must be provided, for details **
|
||
** **
|
||
** ************************************************************************ **/
|
||
|
||
static char Id[] = "@(#)$Id: cmdLog.c,v 1.1 2000/06/28 00:17:32 rk Exp $";
|
||
static void *UseId[] = { &UseId, Id };
|
||
|
||
/** ************************************************************************ **/
|
||
/** HEADERS **/
|
||
/** ************************************************************************ **/
|
||
|
||
#include "modules_def.h"
|
||
|
||
/** ************************************************************************ **/
|
||
/** LOCAL DATATYPES **/
|
||
/** ************************************************************************ **/
|
||
|
||
/** not applicable **/
|
||
|
||
/** ************************************************************************ **/
|
||
/** CONSTANTS **/
|
||
/** ************************************************************************ **/
|
||
|
||
#define PART_LEN 256 /** Length of the string parts for **/
|
||
/** facility list handling **/
|
||
|
||
/** ************************************************************************ **/
|
||
/** MACROS **/
|
||
/** ************************************************************************ **/
|
||
|
||
/** not applicable **/
|
||
|
||
/** ************************************************************************ **/
|
||
/** LOCAL DATA **/
|
||
/** ************************************************************************ **/
|
||
|
||
static char module_name[] = "cmdLog.c"; /** File name of this module **/
|
||
#if WITH_DEBUGGING_CALLBACK
|
||
static char _proc_cmdModuleLog[] = "cmdModuleLog";
|
||
#endif
|
||
|
||
static char _stderr[] = "stderr";
|
||
static char _stdout[] = "stdout";
|
||
static char _null[] = "null";
|
||
static char _none[] = "none";
|
||
|
||
/** ************************************************************************ **/
|
||
/** PROTOTYPES **/
|
||
/** ************************************************************************ **/
|
||
|
||
/** not applicable **/
|
||
|
||
|
||
/*++++
|
||
** ** Function-Header ***************************************************** **
|
||
** **
|
||
** Function: cmdModuleLog **
|
||
** **
|
||
** Description: Callback function for 'log' **
|
||
** **
|
||
** First Edition: 91/10/23 **
|
||
** **
|
||
** Parameters: ClientData client_data **
|
||
** Tcl_Interp *interp According Tcl interp.**
|
||
** int argc Number of arguments **
|
||
** char *argv[] Argument array **
|
||
** **
|
||
** Result: int TCL_OK Successfull completion **
|
||
** TCL_ERROR Any error **
|
||
** **
|
||
** Attached Globals: tracelist List containing all tracing settings **
|
||
** **
|
||
** ************************************************************************ **
|
||
++++*/
|
||
|
||
int cmdModuleLog( ClientData client_data,
|
||
Tcl_Interp *interp,
|
||
int argc,
|
||
char *argv[])
|
||
{
|
||
char **facptr;
|
||
int i, len = 0, alc_len = PART_LEN, save_len;
|
||
char *faclist, *s, *tmp, *t;
|
||
|
||
#if WITH_DEBUGGING_CALLBACK
|
||
ErrorLogger( NO_ERR_START, LOC, _proc_cmdModuleLog, NULL);
|
||
#endif
|
||
|
||
/**
|
||
** Whatis mode?
|
||
**/
|
||
|
||
if( flags & (M_WHATIS | M_HELP))
|
||
return( TCL_OK); /** ------- EXIT PROCEDURE -------> **/
|
||
|
||
/**
|
||
** Parameter check
|
||
**/
|
||
|
||
if( argc < 3) {
|
||
if( OK != ErrorLogger( ERR_USAGE, LOC, argv[0], " error-weight",
|
||
" facility", NULL))
|
||
return( TCL_ERROR); /** -------- EXIT (FAILURE) -------> **/
|
||
}
|
||
|
||
/**
|
||
** Display mode?
|
||
**/
|
||
|
||
if( flags & M_DISPLAY) {
|
||
fprintf( stderr, "%s\t ", argv[ 0]);
|
||
while( --argc)
|
||
fprintf( stderr, "%s ", *++argv);
|
||
fprintf( stderr, "\n");
|
||
return( TCL_OK); /** ------- EXIT PROCEDURE -------> **/
|
||
}
|
||
|
||
/**
|
||
** Get the current facility pointer.
|
||
**/
|
||
|
||
if((char **) NULL == (facptr = GetFacilityPtr( argv[1])))
|
||
return(( OK == ErrorLogger( ERR_INVWGHT_WARN, LOC, argv[1], NULL)) ?
|
||
TCL_OK : TCL_ERROR);
|
||
|
||
/**
|
||
** Alloctae memory for the facility list
|
||
**/
|
||
|
||
if((char *) NULL == (faclist = (char *) malloc( alc_len)))
|
||
return(( OK == ErrorLogger( ERR_ALLOC, LOC, NULL)) ?
|
||
TCL_OK : TCL_ERROR);
|
||
|
||
/**
|
||
** Scan all given facilities and add them to the list
|
||
**/
|
||
|
||
for( i=2; i<argc; i++) {
|
||
save_len = len;
|
||
len += strlen( argv[ i]) + 1;
|
||
|
||
while( len + 1 > alc_len) {
|
||
alc_len += PART_LEN;
|
||
if((char *) NULL == (faclist = (char *) realloc( faclist, alc_len)))
|
||
return(( OK == ErrorLogger( ERR_ALLOC, LOC, NULL)) ?
|
||
TCL_OK : TCL_ERROR);
|
||
}
|
||
|
||
faclist[save_len] = ':';
|
||
strcpy( &faclist[save_len + 1], argv[ i]);
|
||
}
|
||
|
||
/**
|
||
** Now scan the whole list and copy all valid parts into a new buffer
|
||
**/
|
||
|
||
if((char *) NULL == (tmp = (char *) malloc( strlen( faclist)))) {
|
||
free( faclist);
|
||
return(( OK == ErrorLogger( ERR_ALLOC, LOC, NULL)) ?
|
||
TCL_OK : TCL_ERROR);
|
||
}
|
||
|
||
for( t = tmp, s = strtok( faclist, ":, \t");
|
||
s;
|
||
s = strtok( NULL, ":, \t") ) {
|
||
|
||
if( '.' == *s || '/' == *s || /** filename **/
|
||
!strcmp( _stderr, s) || !strcmp( _stdout, s) || /** special **/
|
||
!strcmp( _null, s) || !strcmp( _none, s) || /** null **/
|
||
CheckFacility( s, &i, &i) ) { /** syslog **/
|
||
|
||
if( t != tmp)
|
||
*t++ = ':';
|
||
strcpy( t, s);
|
||
|
||
t += strlen( s);
|
||
|
||
} else {
|
||
|
||
/**
|
||
** bad facility found
|
||
**/
|
||
|
||
if( OK != ErrorLogger( ERR_INVFAC_WARN, LOC, s, NULL))
|
||
break; /** for **/
|
||
}
|
||
} /** for **/
|
||
|
||
/**
|
||
** Now, 'tmp' should contain the new list of facilities. Check wheter
|
||
** there has been one allocated so far ...
|
||
** We do not need the orginal faclist any more.
|
||
**/
|
||
|
||
free( faclist);
|
||
|
||
if((char *) NULL != *facptr)
|
||
free( *facptr);
|
||
|
||
*facptr = tmp;
|
||
|
||
#if WITH_DEBUGGING_CALLBACK
|
||
ErrorLogger( NO_ERR_END, LOC, _proc_cmdModuleLog, NULL);
|
||
#endif
|
||
|
||
return( TCL_OK);
|
||
|
||
} /** End of 'cmdModuleLog' **/
|
||
|