diff options
-rw-r--r-- | etc/default/vyatta-cfg | 21 | ||||
-rwxr-xr-x | scripts/vyatta-cfg-notify | 4 | ||||
-rw-r--r-- | src/cli_new.c | 47 |
3 files changed, 51 insertions, 21 deletions
diff --git a/etc/default/vyatta-cfg b/etc/default/vyatta-cfg index d369e0f..e560788 100644 --- a/etc/default/vyatta-cfg +++ b/etc/default/vyatta-cfg @@ -1,15 +1,18 @@ # Vyatta shell environment variables for config mode # should be sourced from /etc/default/vyatta -export VYATTA_ACTIVE_CONFIGURATION_DIR=${vyatta_configdir}/active -export VYATTA_CHANGES_ONLY_DIR=${vyatta_configdir}/tmp/changes_only_$$ -export VYATTA_TEMP_CONFIG_DIR=${vyatta_configdir}/tmp/new_config_$$ -export VYATTA_CONFIG_TMP=${vyatta_configdir}/tmp/tmp_$$ -export VYATTA_CONFIG_TEMPLATE=$vyatta_cfg_templates -export VYATTA_EDIT_LEVEL=/ -export VYATTA_TEMPLATE_LEVEL=/ -export VYATTA_TAG_NAME=node.tag -export VYATTA_MOD_NAME=.modified +{ +declare -x -r VYATTA_ACTIVE_CONFIGURATION_DIR=${vyatta_configdir}/active +declare -x -r VYATTA_CHANGES_ONLY_DIR=${vyatta_configdir}/tmp/changes_only_$$ +declare -x -r VYATTA_TEMP_CONFIG_DIR=${vyatta_configdir}/tmp/new_config_$$ +declare -x -r VYATTA_CONFIG_TMP=${vyatta_configdir}/tmp/tmp_$$ +declare -x -r VYATTA_CONFIG_TEMPLATE=$vyatta_cfg_templates +declare -x -r VYATTA_EDIT_LEVEL=/ +declare -x -r VYATTA_TEMPLATE_LEVEL=/ +declare -x -r VYATTA_TAG_NAME=node.tag +declare -x -r VYATTA_MOD_NAME=.modified +declare -x -r VYATTA_CFG_GROUP_NAME=vyattacfg +} 2>/dev/null || : # don't set level if already set if [ -n "$VYATTA_USER_LEVEL_DIR" ]; then diff --git a/scripts/vyatta-cfg-notify b/scripts/vyatta-cfg-notify index 82dc6a3..07a385d 100755 --- a/scripts/vyatta-cfg-notify +++ b/scripts/vyatta-cfg-notify @@ -1,11 +1,13 @@ #!/bin/bash +[ -r /etc/default/vyatta ] && source /etc/default/vyatta + declare cur_tty=$(ps -o tty= |head -n1) declare cur_uid=($(ps -o ruser= n |head -n1)) declare cur_user=$(grep "[^:]\+:[^:]*:${cur_uid[0]}:" /etc/passwd \ | cut -d ':' -f 1) declare -a ulist=( $(ps -a -o args,tty,ruser n \ - | grep '^newgrp quaggavty' | cut -c 29-) ) + | grep "^newgrp $VYATTA_CFG_GROUP_NAME" | cut -c 29-) ) for (( i = 0; i < ${#ulist[@]}; i += 2 )); do utty=${ulist[i]} diff --git a/src/cli_new.c b/src/cli_new.c index d4380d5..3f64489 100644 --- a/src/cli_new.c +++ b/src/cli_new.c @@ -240,19 +240,44 @@ release_config_lock() int get_config_lock() { - int fd = open(LOCK_FILE, O_WRONLY | O_CREAT | O_EXCL, 0660); - if (fd == -1) { - return -1; - } - if (close(fd) == -1) { - release_config_lock(); - return -1; - } - if (atexit(release_config_lock) != 0) { + int fd = -1; + FILE *lfile = NULL; + int ret = -1; + + do { + /* create lock file */ + fd = open(LOCK_FILE, O_WRONLY | O_CREAT | O_EXCL, 0660); + if (fd == -1) { + break; + } + + /* write pid into lock file */ + if ((lfile = fdopen(fd, "w")) == NULL) { + break; + } + if (fprintf(lfile, "%u", getpid()) < 0) { + break; + } + /* fclose also closes fd */ + if (fclose(lfile) != 0) { + break; + } + /* clean up on exit */ + if (atexit(release_config_lock) != 0) { + break; + } + ret = 0; + } while (0); + + if (ret == -1) { + if (lfile) { + fclose(lfile); + } else if (fd != -1) { + close(fd); + } release_config_lock(); - return -1; } - return 0; + return ret; } void internal_error(int line, char *file) |