diff options
author | An-Cheng Huang <ancheng@vyatta.com> | 2007-09-25 15:55:26 -0700 |
---|---|---|
committer | An-Cheng Huang <ancheng@vyatta.com> | 2007-09-25 15:55:26 -0700 |
commit | e9a79a249cec69fc178098d2f75db9389068510a (patch) | |
tree | 0e366094b7fecd3988c243fbbb574015e0c900c8 /src/cli_objects.c | |
download | vyatta-cfg-e9a79a249cec69fc178098d2f75db9389068510a.tar.gz vyatta-cfg-e9a79a249cec69fc178098d2f75db9389068510a.zip |
initial import (from eureka /cli) plus new build system.upstream
Diffstat (limited to 'src/cli_objects.c')
-rw-r--r-- | src/cli_objects.c | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/src/cli_objects.c b/src/cli_objects.c new file mode 100644 index 0000000..9bb36f0 --- /dev/null +++ b/src/cli_objects.c @@ -0,0 +1,343 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <ctype.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/wait.h> +#include <unistd.h> +#include <dirent.h> +#include <limits.h> +#include <stdarg.h> +#include "cli_val.h" +#include "cli_parse.h" +#include <regex.h> + +#include "cli_val_engine.h" + +#include "cli_objects.h" + +/************************ Storage area: *****************/ + +static char *at_string=NULL; +static boolean in_delete_action=FALSE; +static valstruct cli_value; +static boolean in_commit=FALSE; /* TRUE if in commit program*/ +static boolean in_exec=FALSE; /* TRUE if in exec */ +static boolean _is_echo=FALSE; +static boolean _is_silent_msg=FALSE; +static first_seg f_seg_a; +static first_seg f_seg_c; +static first_seg f_seg_m; +static int in_cond_tik=0; + +/******************** Accessors: ************************/ + +static char at_buffer[1024]={0}; + +/* the string to use as $(@), must be set + before call to expand_string */ +char* get_at_string(void) { + if(at_string) { + return at_string; + } else { + return at_buffer; + } +} + +void set_at_string(char* s) { + if(s!=at_buffer) { + at_string=s; + } else { + at_string=NULL; + } +} + +void free_at_string(void) { + if(at_string) { + if(at_string!=at_buffer) free(at_string); + at_string=NULL; + } +} + +boolean is_in_delete_action(void) { + return in_delete_action; +} + +void set_in_delete_action(boolean b) { + in_delete_action=b; +} + +boolean is_in_commit(void) { + return in_commit; +} + +void set_in_commit(boolean b) { + in_commit=b; +} + +boolean is_in_exec(void) { + return in_exec; +} + +void set_in_exec(boolean b) { + in_exec=b; +} + +boolean is_echo(void) { + return _is_echo; +} + +void set_echo(boolean b) { + _is_echo=b; +} + +boolean is_silent_msg(void) { + return _is_silent_msg; +} + +void set_silent_msg(boolean b) { + _is_silent_msg=b; +} + +valstruct* get_cli_value_ptr(void) { + return &cli_value; +} + +first_seg* get_f_seg_a_ptr(void) { + return &f_seg_a; +} + +first_seg* get_f_seg_c_ptr(void) { + return &f_seg_c; +} + +first_seg* get_f_seg_m_ptr(void) { + return &f_seg_m; +} + +int is_in_cond_tik(void) { + return in_cond_tik; +} + +void set_in_cond_tik(int ict) { + in_cond_tik=ict; +} + +void dec_in_cond_tik(void) { + --in_cond_tik; +} + +const char* get_tdirp(void) { + + const char* tdirp=getenv(ENV_T_DIR); + + if (!tdirp) + tdirp = DEF_T_DIR; + if(!tdirp) + tdirp=""; + + return tdirp; +} + +const char* get_cdirp(void) { + return getenv(ENV_C_DIR); +} + +const char* get_adirp(void) { + + const char* adirp=getenv(ENV_A_DIR); + + if (!adirp) + adirp = DEF_A_DIR; + if(!adirp) + adirp=""; + + return adirp; +} + +const char* get_mdirp(void) { + + const char* mdirp=getenv(ENV_M_DIR); + + if(!mdirp) + mdirp=""; + + return mdirp; +} + +const char* get_tmpp(void) { + + const char* tmpp=getenv(ENV_TMP_DIR); + + if(!tmpp) + tmpp=""; + + return tmpp; +} + +char* get_elevp(void) { + + static char elevp_buffer[2049]; + static char* elevp=NULL; + + if(elevp==NULL) { + + const char* tmp=getenv(ENV_EDIT_LEVEL); + + if(tmp) { + strncpy(elevp_buffer,tmp,sizeof(elevp_buffer)-1); + elevp=elevp_buffer; + } + } + + return elevp; +} + +char* get_tlevp(void) { + + static char tlevp_buffer[2049]; + static char* tlevp=NULL; + + if(tlevp==NULL) { + + const char* tmp=getenv(ENV_TEMPLATE_LEVEL); + + if(tmp) { + strncpy(tlevp_buffer,tmp,sizeof(tlevp_buffer)-1); + tlevp=tlevp_buffer; + } + } + + return tlevp; +} + +/************************* Init ***************************/ + +void init_edit() +{ + int elevlen = 0; + int tlevlen = 0; + + init_paths(TRUE); + if (!get_elevp()) + bye("Not in configuration mode"); + if (!get_tlevp()) + bye("INTERNAL: environment var |%s| is not set",ENV_TEMPLATE_LEVEL); + elevlen = strlen(get_elevp()); + tlevlen = strlen(get_tlevp()); + if (elevlen > 0 && get_elevp()[elevlen - 1]=='/') { + /* cut off terminateing slash */ + --elevlen; + get_elevp()[elevlen] = 0; + } + if (elevlen) { + char *slashp; + char * scanp; + if (*get_elevp()!='/') + INTERNAL; + scanp = get_elevp() + 1; + while (TRUE) { + slashp = strchr(scanp, '/'); + if (slashp) + *slashp = 0; + push_path(&m_path, scanp); + if (slashp) { + *slashp = '/'; + scanp = slashp+1; + }else + break; + } + } + switch_path(MPATH); + if (tlevlen > 0 && get_tlevp()[tlevlen - 1]=='/') { + /* cut off terminateing slash */ + --tlevlen; + get_tlevp()[tlevlen] = 0; + } + if (tlevlen) { + char *slashp; + char * scanp; + if (*get_tlevp()!='/') + INTERNAL; + scanp = get_tlevp() + 1; + while (TRUE) { + slashp = strchr(scanp, '/'); + if (slashp) + *slashp = 0; + push_path(&t_path, scanp); + if (slashp) { + *slashp = '/'; + scanp = slashp+1; + }else + break; + } + } +} + +void init_paths(boolean for_commit) +{ + struct stat statbuf; + const char* tdirp = get_tdirp(); + const char* cdirp = get_cdirp(); + const char* adirp = get_adirp(); + const char* mdirp = get_mdirp(); + const char* tmpp = get_tmpp(); + + if (!mdirp || !mdirp[0]) + bye("Environment variable %s for temp configuration is not set",ENV_M_DIR); + if (!cdirp) + bye("INTERNAL: environment var |%s| is not set", + ENV_C_DIR); + if (!tmpp || !tmpp[0]) + bye("INTERNAL: environment var |%s| is not set", + ENV_TMP_DIR); + /* make sure that template root is present */ + + if (lstat(tdirp, &statbuf) < 0) + bye("Template directory |%s| isn't present\n", tdirp); + if ((statbuf.st_mode & S_IFMT) != S_IFDIR) + bye("Template directory |%s| isn't a directory\n", tdirp); + /* set paths to current roots */ + if (for_commit) { + int max_len; + const char *startp; + + /* make sure that master configuration root is present */ + if (lstat(adirp, &statbuf) < 0) + bye("Master configuration directory |%s| isn't present\n", adirp); + if ((statbuf.st_mode & S_IFMT) != S_IFDIR) + bye("Master configuration directory |%s| isn't a directory\n", adirp); + + get_f_seg_a_ptr()->f_segp = adirp; + get_f_seg_c_ptr()->f_segp = cdirp; + get_f_seg_m_ptr()->f_segp = mdirp; + get_f_seg_a_ptr()->f_seglen = strlen(adirp); + get_f_seg_c_ptr()->f_seglen = strlen(cdirp); + get_f_seg_m_ptr()->f_seglen = strlen(mdirp); + if(get_f_seg_a_ptr()->f_seglen > get_f_seg_m_ptr()->f_seglen) { + max_len = get_f_seg_a_ptr()->f_seglen; + startp = adirp; + }else{ + max_len = get_f_seg_m_ptr()->f_seglen; + startp = mdirp; + } + if(get_f_seg_c_ptr()->f_seglen > max_len) { + max_len = get_f_seg_c_ptr()->f_seglen; + startp = cdirp; + } + get_f_seg_a_ptr()->f_segoff = max_len - get_f_seg_a_ptr()->f_seglen; + get_f_seg_c_ptr()->f_segoff = max_len - get_f_seg_c_ptr()->f_seglen; + get_f_seg_m_ptr()->f_segoff = max_len - get_f_seg_m_ptr()->f_seglen; + init_path(&m_path, startp); + switch_path(get_f_seg_c_ptr()); + m_path.print_offset = max_len; + }else + init_path(&m_path, mdirp); + + init_path(&t_path, tdirp); +} + +/**********************************************************/ |