1    | /*****
2    |  ** ** Module Header ******************************************************* **
3    |  ** 									     **
4    |  **   Modules Revision 3.0						     **
5    |  **   Providing a flexible user environment				     **
6    |  ** 									     **
7    |  **   File:		ModuleCmd_Purge.c				     **
8    |  **   First Edition:	1991/10/23					     **
9    |  ** 									     **
10   |  **   Authors:	John Furlan, jlf@behere.com				     **
11   |  **		Jens Hamisch, jens@Strawberry.COM			     **
12   |  ** 									     **
13   |  **   Description:	Removes all loaded modulefiles from the environment. **
14   |  ** 									     **
15   |  **   Exports:		ModuleCmd_Purge					     **
16   |  ** 									     **
17   |  **   Notes:								     **
18   |  ** 									     **
19   |  ** ************************************************************************ **
20   |  ****/
21   | 
22   | /** ** Copyright *********************************************************** **
23   |  ** 									     **
24   |  ** Copyright 1991-1994 by John L. Furlan.                      	     **
25   |  ** see LICENSE.GPL, which must be provided, for details		     **
26   |  ** 									     ** 
27   |  ** ************************************************************************ **/
28   | 
29   | static char Id[] = "@(#)$Id: ModuleCmd_Purge.c.src.html,v 1.6 2006/01/18 05:35:11 rkowen Exp $";
30   | static void *UseId[] = { &UseId, Id };
31   | 
32   | /** ************************************************************************ **/
33   | /** 				      HEADERS				     **/
34   | /** ************************************************************************ **/
35   | 
36   | #include "modules_def.h"
37   | 
38   | /** ************************************************************************ **/
39   | /** 				  LOCAL DATATYPES			     **/
40   | /** ************************************************************************ **/
41   | 
42   | /** not applicable **/
43   | 
44   | /** ************************************************************************ **/
45   | /** 				     CONSTANTS				     **/
46   | /** ************************************************************************ **/
47   | 
48   | /** not applicable **/
49   | 
50   | /** ************************************************************************ **/
51   | /**				      MACROS				     **/
52   | /** ************************************************************************ **/
53   | 
54   | /** not applicable **/
55   | 
56   | /** ************************************************************************ **/
57   | /** 				    LOCAL DATA				     **/
58   | /** ************************************************************************ **/
59   | 
60   | static	char	module_name[] = "ModuleCmd_Purge.c";	/** File name of this module **/
61   | 
62   | /** ************************************************************************ **/
63   | /**				    PROTOTYPES				     **/
64   | /** ************************************************************************ **/
65   | 
66   | /** not applicable **/
67   | 
68   | 
69   | /*++++
70   |  ** ** Function-Header ***************************************************** **
71   |  ** 									     **
72   |  **   Function:		ModuleCmd_Purge					     **
73   |  ** 									     **
74   |  **   Description:	Execution of the module-command 'purge'		     **
75   |  ** 									     **
76   |  **   First Edition:	1991/10/23					     **
77   |  ** 									     **
78   |  **   Parameters:	Tcl_Interp	*interp		Attached Tcl Interp. **
79   |  **			int		 argc		Number of arguments  **
80   |  **			char 		*argv[]		Argument list	     **
81   |  ** 									     **
82   |  **   Result:		int	TCL_ERROR	Failure			     **
83   |  **				TCL_OK		Successfull operation	     **
84   |  ** 									     **
85   |  **   Attached Globals:							     **
86   |  ** 									     **
87   |  ** ************************************************************************ **
88   |  ++++*/
89   | 
90   | int	ModuleCmd_Purge(	Tcl_Interp	*interp,
91   |                 		int		 argc,
92   |                 		char		*argv[])
93   | {
94   |     char	*lmodules = NULL,
95   | 		*cur_module = NULL,
96   | 		*loaded_modules,
97   | 		*unload_argv[ MOD_BUFSIZE];
98   |     int		 unload_argc = 0,
99   |     		 status;
100  | 
101  | #if WITH_DEBUGGING_MODULECMD
102  |     fprintf( stderr, "ModuleCmd_Purge(%d):DEBUG: Starting\n", __LINE__);
103  | #endif
104  | 
105  |     /**
106  |      **  Get the list of currently loaded modules from the environment variable
107  |      **  LOADEDMODULES
108  |      **/
109  |     if( NULL == (loaded_modules =
110  | 	(char *) Tcl_GetVar2( interp, "env", "LOADEDMODULES",
111  | 	TCL_GLOBAL_ONLY))) {
112  | 	if( OK != ErrorLogger( ERR_MODULE_PATH, LOC, NULL))
113  | 	    return( TCL_ERROR);		/** -------- EXIT (FAILURE) -------- **/
114  | 	else
115  | 	    return( TCL_OK);		/** ---- EXIT (Nothing to list) ---- **/
116  |     }
117  | 
118  |     if((char *) NULL == (lmodules = stringer(NULL,0, loaded_modules, NULL))) 
119  | 	if( OK != ErrorLogger( ERR_STRING, LOC, NULL))
120  | 	    return( TCL_ERROR);		/** -------- EXIT (FAILURE) -------- **/
121  | 
122  |     /**
123  |      **  Build a NULL terminated list of loaded modules
124  |      **/
125  |     for( cur_module = strtok( lmodules, ":");
126  |          cur_module && unload_argc < MOD_BUFSIZE-1;
127  |          cur_module = strtok( NULL, ":"))
128  |         unload_argv[ unload_argc++] = cur_module;
129  |     
130  |     unload_argv[ unload_argc] = NULL;
131  |     
132  |     /**
133  |      **  Unload 'em all
134  |      **  We always say the load succeeded.  ModuleCmd_Load will
135  |      **  output any necessary error messages.
136  |      **/
137  |     ModuleCmd_Load( interp, 0, unload_argc, unload_argv);
138  |     status = TCL_OK;
139  | 
140  |     /**
141  |      **  Free, what has been allocated and pass the load's result to the caller
142  |      **/
143  |     null_free((void *) &lmodules);
144  | 
145  | #if WITH_DEBUGGING_MODULECMD
146  |     fprintf( stderr, "ModuleCmd_Purge(%d):DEBUG: End\n", __LINE__);
147  | #endif
148  | 
149  |     return( status);
150  | 
151  | } /** End of 'ModuleCmd_Purge' **/