* Florian Bruhin <me _at_ the _minus_ compiler _dot_ org> [2012-11-05 11:52:42 +0100]: > As requested by maxfragg. Simply calls {get,set,unset}env(3). As discussed in IRC: thorsten` The-Compiler: i even would create another error-code HERBST_ENV_ thorsten` HERBST_ENV_UNSET The-Compiler and what about setenv() then? The-Compiler I don't really want to check errno and all that, so I'd prefer just returning HERBST_ENV_ERROR or whatever thorsten` yes that's ok thorsten` for setenv it's ok.. but i think the check is wrong The-Compiler how so? thorsten` The setenv() function returns zero on success, or -1 on error Fixed that in the attached patch -- () ascii ribbon campaign - stop html mail www.asciiribbon.org /\ www.the-compiler.org | I love long mails http://email.is-not-s.ms/ You know it's going to be a long day when you get up, shave and shower, start to get dressed and your shoes are still warm. -- Dean Webber
From be74a9021d597f99cdbfb3796c52f1454bb13af0 Mon Sep 17 00:00:00 2001
From: Florian Bruhin <git _at_ the _minus_ compiler _dot_ org>
Date: Mon, 5 Nov 2012 11:49:11 +0100
Subject: [PATCH] New commands: getenv/setenv/unsetenv
Requested by maxfragg. They could be used like this:
if ! hc getenv SSH_AGENT_PID > /dev/null; then
hc setenv SSH_AGENT_PID "$SSH_AGENT_PID"
fi
---
NEWS | 1 +
doc/herbstluftwm.txt | 9 +++++++++
src/command.c | 3 +++
src/ipc-protocol.h | 1 +
src/main.c | 40 +++++++++++++++++++++++++++++++++++++++-
5 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/NEWS b/NEWS
index 16ea50b..3d91deb 100644
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,7 @@ Changes:
* set the urgent flag on _NET_WM_STATE_DEMANDS_ATTENTION
* clear the urgent flag on window focus
* new command: list_padding
+ * new commands: getenv/setenv/unsetenv
Release: 0.4.1 on 2012-08-30
----------------------------
diff --git a/doc/herbstluftwm.txt b/doc/herbstluftwm.txt
index bf97816..b74e98b 100644
--- a/doc/herbstluftwm.txt
+++ b/doc/herbstluftwm.txt
@@ -598,6 +598,15 @@ pseudotile *on*|*off*|*toggle*::
the client size will stay the floating size. The only reason to resize the
client is to ensure, that it fits into its tile.
+getenv 'NAME'::
+ Gets the value of the environment variable 'NAME'.
+
+setenv 'NAME' 'VALUE'::
+ Set the value of the environment variable 'NAME' to 'VALUE'.
+
+unsetenv 'NAME'::
+ Unsets the environment variable 'NAME'.
+
[[SETTINGS]]
SETTINGS
--------
diff --git a/src/command.c b/src/command.c
index e7c9b76..20c1370 100644
--- a/src/command.c
+++ b/src/command.c
@@ -114,6 +114,9 @@ struct {
{ "unrule", 2, no_completion },
{ "fullscreen", 2, no_completion },
{ "pseudotile", 2, no_completion },
+ { "getenv", 2, no_completion },
+ { "setenv", 3, no_completion },
+ { "unsetenv", 2, no_completion },
{ 0 },
};
diff --git a/src/ipc-protocol.h b/src/ipc-protocol.h
index effa207..8038597 100644
--- a/src/ipc-protocol.h
+++ b/src/ipc-protocol.h
@@ -29,6 +29,7 @@ enum {
HERBST_TAG_IN_USE,
HERBST_FORBIDDEN,
HERBST_NO_PARAMETER_EXPECTED,
+ HERBST_ENV_UNSET,
};
#endif
diff --git a/src/main.c b/src/main.c
index 07be5e6..f31a42e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -60,6 +60,9 @@ int wmexec(int argc, char** argv);
static void remove_zombies(int signal);
int custom_hook_emit(int argc, char** argv);
int jumpto_command(int argc, char** argv);
+int getenv_command(int argc, char** argv, GString* result);
+int setenv_command(int argc, char** argv);
+int unsetenv_command(int argc, char** argv);
// handler for X-Events
void buttonpress(XEvent* event);
@@ -149,7 +152,10 @@ CommandBinding g_commands[] = {
CMD_BIND_NO_OUTPUT( "detect_monitors",detect_monitors_command),
CMD_BIND( "chain", command_chain_command),
CMD_BIND( "and", command_chain_command),
- CMD_BIND( "or", command_chain_command),
+ CMD_BIND( "or", command_chain_command),
+ CMD_BIND( "getenv", getenv_command),
+ CMD_BIND_NO_OUTPUT( "setenv", setenv_command),
+ CMD_BIND_NO_OUTPUT( "unsetenv", unsetenv_command),
{{ NULL }}
};
@@ -352,6 +358,38 @@ int jumpto_command(int argc, char** argv) {
return 0;
}
+int getenv_command(int argc, char** argv, GString* result) {
+ if (argc < 2) {
+ return HERBST_INVALID_ARGUMENT;
+ }
+ char* envvar = getenv(argv[1]);
+ if (envvar == NULL) {
+ return HERBST_ENV_UNSET;
+ }
+ g_string_append_printf(result, "%s\n", envvar);
+ return 0;
+}
+
+int setenv_command(int argc, char** argv) {
+ if (argc < 3) {
+ return HERBST_INVALID_ARGUMENT;
+ }
+ if (setenv(argv[1], argv[2], 1) != 0) {
+ return HERBST_INVALID_ARGUMENT;
+ }
+ return 0;
+}
+
+int unsetenv_command(int argc, char** argv) {
+ if (argc < 2) {
+ return HERBST_INVALID_ARGUMENT;
+ }
+ if (unsetenv(argv[1]) != 0) {
+ return HERBST_INVALID_ARGUMENT;
+ }
+ return 0;
+}
+
// handle x-events:
void event_on_configure(XEvent event) {
--
1.8.0
Attachment:
pgp_FIh1qxlFB.pgp
Description: PGP signature