aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/ChangeLog6
-rw-r--r--g10/exec.c18
-rw-r--r--g10/exec.h1
-rw-r--r--g10/g10.c14
4 files changed, 30 insertions, 9 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index d959c5110..349779413 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,9 @@
+2002-07-03 David Shaw <[email protected]>
+
+ * exec.h, exec.c (set_exec_path, exec_write), g10.c (main): If
+ USE_EXEC_PATH is defined at compile time, use it to lock the
+ exec-path and not allow the user to change it.
+
2002-07-02 David Shaw <[email protected]>
* options.h, g10.c (main), keyserver.c (keyserver_refresh):
diff --git a/g10/exec.c b/g10/exec.c
index 893718ad1..cfdf6d057 100644
--- a/g10/exec.c
+++ b/g10/exec.c
@@ -51,6 +51,7 @@ int exec_write(struct exec_info **info,const char *program,
int exec_read(struct exec_info *info) { return G10ERR_GENERAL; }
int exec_finish(struct exec_info *info) { return G10ERR_GENERAL; }
+int set_exec_path(const char *path) { return G10ERR_GENERAL; }
#else /* ! NO_EXEC */
@@ -90,6 +91,19 @@ static int win_system(const char *command)
}
#endif
+int set_exec_path(const char *path)
+{
+ /* Notice that path is never freed. That is intentional due to the
+ way putenv() works. */
+ char *p=m_alloc(5+strlen(path)+1);
+ strcpy(p,"PATH=");
+ strcat(p,path);
+ if(putenv(p)!=0)
+ return G10ERR_GENERAL;
+ else
+ return 0;
+}
+
/* Makes a temp directory and filenames */
static int make_tempdir(struct exec_info *info)
{
@@ -298,6 +312,10 @@ int exec_write(struct exec_info **info,const char *program,
if(program==NULL && args_in==NULL)
BUG();
+#ifdef USE_EXEC_PATH
+ set_exec_path(USE_EXEC_PATH);
+#endif
+
*info=m_alloc_clear(sizeof(struct exec_info));
if(name)
diff --git a/g10/exec.h b/g10/exec.h
index 2e0be460b..442952804 100644
--- a/g10/exec.h
+++ b/g10/exec.h
@@ -18,5 +18,6 @@ int exec_write(struct exec_info **info,const char *program,
const char *args_in,const char *name,int writeonly,int binary);
int exec_read(struct exec_info *info);
int exec_finish(struct exec_info *info);
+int set_exec_path(const char *path);
#endif /* !_EXEC_H_ */
diff --git a/g10/g10.c b/g10/g10.c
index 641cde636..707b54dc1 100644
--- a/g10/g10.c
+++ b/g10/g10.c
@@ -46,6 +46,7 @@
#include "status.h"
#include "g10defs.h"
#include "keyserver-internal.h"
+#include "exec.h"
enum cmd_and_opt_values { aNull = 0,
oArmor = 'a',
@@ -1331,15 +1332,10 @@ main( int argc, char **argv )
break;
case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
case oExecPath:
- {
- /* Notice that path is never freed. That is
- intentional due to the way putenv() works. */
- char *path=m_alloc(5+strlen(pargs.r.ret_str)+1);
- strcpy(path,"PATH=");
- strcat(path,pargs.r.ret_str);
- if(putenv(path)!=0)
- log_error(_("unable to set exec-path to %s\n"),path);
- }
+#ifndef USE_EXEC_PATH
+ if(set_exec_path(pargs.r.ret_str))
+ log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
+#endif
break;
case oNotation:
add_notation_data( pargs.r.ret_str, 0 );