diff options
Diffstat (limited to 'src/delete.c')
-rw-r--r-- | src/delete.c | 391 |
1 files changed, 0 insertions, 391 deletions
diff --git a/src/delete.c b/src/delete.c deleted file mode 100644 index f2d3d31..0000000 --- a/src/delete.c +++ /dev/null @@ -1,391 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <sys/stat.h> -#include <dirent.h> - -#include "cli_val.h" -#include "cli_objects.h" - -static void remove_rf(boolean do_umount) -{ - char *command = NULL; - touch(); - if (do_umount) { - command = malloc(strlen(get_mdirp()) + 20); - sprintf(command, "sudo umount %s", get_mdirp()); - system(command); - } - - command = realloc(command, strlen(m_path.path) + 10); - sprintf(command, "rm -rf %s", m_path.path); - system(command); - - if (do_umount) { - command = realloc(command, strlen(get_mdirp()) + strlen(get_cdirp()) + - strlen(get_mdirp()) + 100); - sprintf(command, "sudo mount -t $UNIONFS -o dirs=%s=rw:%s=ro" - " $UNIONFS %s", get_cdirp(), get_adirp(), get_mdirp()); - system(command); - } - free(command); -} - -static boolean has_default(char **def, int size) -{ - char *buf_ptr; - FILE *fp = fopen(t_path.path, "r"); - - if (fp) { - char buf[1025]; - while (fgets(buf, 1024, fp)) { - if (strncmp(buf, "default:", 8) == 0) { - buf_ptr = index(buf,':'); - if (buf_ptr == NULL) { - break; - } - - //iterate up to non-whitespace character - buf_ptr++; - while (buf_ptr < (buf + size)) { - if (*buf_ptr == ' ') { - buf_ptr++; - } - else { - break; - } - } - - if (size < strlen(buf_ptr)-1) { - bye("default buffer size is too small\n"); - } - memcpy(*def, buf_ptr, strlen(buf_ptr)-1); - fclose(fp); - return 0; - } - } - fclose(fp); - } - - return 1; -} - -static void reset_default(const char *def_val) -{ - if (def_val == NULL) - return; - - //strip off quotes - char tmp_val[1025]; - char *ptr = index(def_val,'"'); - if (ptr != NULL) { - strcpy(tmp_val,ptr+1); - ptr = rindex(tmp_val,'"'); - if (ptr != NULL) { - *ptr = '\0'; - } - else { - strcpy(tmp_val,def_val); //go with original value. - } - } - else { - strcpy(tmp_val,def_val); - } - - char filename[strlen(m_path.path) + 10]; - touch(); - sprintf(filename, "%s/node.val", m_path.path); - - FILE *fp = fopen(filename, "w"); - if (fp == NULL) - bye("can not open: %s", filename); - fputs(tmp_val, fp); - fclose(fp); - - sprintf(filename, "%s/def", m_path.path); - touch_file(filename); -} -/*************************************************** - set_validate: - validate value against definition - return TRUE if OK, FALSE otherwise -****************************************************/ -boolean set_validate(vtw_def *defp, char *valp) -{ - boolean res; - int status; - struct stat statbuf; - - pop_path(&t_path); /* it was tag or real value */ - push_path(&t_path, DEF_NAME); - if (lstat(t_path.path, &statbuf) < 0 || - (statbuf.st_mode & S_IFMT) != S_IFREG) { - fprintf(out_stream, "The specified configuration node is not valid\n"); - bye("Can not set value (2), no definition for %s", m_path.path); - } - /* defniition present */ - if ((status = parse_def(defp, t_path.path, FALSE))) { - bye("parse error: %d\n", status); - } - res = validate_value(defp, valp); - pop_path(&t_path); - return res; -} - -int main(int argc, char **argv) -{ - int ai; - struct stat statbuf; - vtw_def def; - boolean last_tag=0; - int status; - FILE *fp; - boolean res; - char *cp, *delp, *endp; - boolean do_umount; - - /* this is needed before calling certain glib functions */ - g_type_init(); - - if (initialize_output("Delete") == -1) { - bye("can't initialize output\n"); - } - - if (argc < 2) { - fprintf(out_stream, "Need to specify the config node to delete\n"); - bye("nothing to delete\n"); - } - - dump_log( argc, argv); - do_umount = FALSE; - init_edit(); - /* extend both paths per arguments given */ - /* last argument is new value */ - for (ai = 1; ai < argc; ++ai) { - push_path(&t_path, argv[ai]); - push_path(&m_path, argv[ai]); - if (lstat(t_path.path, &statbuf) >= 0) { - if ((statbuf.st_mode & S_IFMT) != S_IFDIR) { - bye("INTERNAL:regular file %s in templates", t_path.path); - } - last_tag = FALSE; - continue; - } /*else */ - pop_path(&t_path); - push_path(&t_path, TAG_NAME); - if (lstat(t_path.path, &statbuf) >= 0) { - if ((statbuf.st_mode & S_IFMT) != S_IFDIR) { - bye("INTERNAL:regular file %s in templates", t_path.path); - } - last_tag = TRUE; - continue; - } - /* no match */ - break; - } - /* - cases: - multiple tag-value - not achild - mutilple tag-value - not the last child - multiple tag-value - last child - single value modified - signle value unmodified - multiple non-tag value - the last value - multiple non-tag value - not the last value - regular child - */ - if (ai == argc) { - /* full path found */ - /* all cases except multiple non-tag value */ - /* check for single value */ - if (last_tag) { - /* case of multiple tag-value - was this a real child? - was it the last child? - */ - struct dirent *dirp; - DIR *dp; - - if (lstat(m_path.path, &statbuf) < 0) { - fprintf(out_stream, "Nothing to delete\n"); - bye("Nothing to delete at %s", m_path.path); - } - - remove_rf(FALSE); - pop_path(&m_path); - if ((dp = opendir(m_path.path)) == NULL){ - INTERNAL; - } - while ((dirp = readdir(dp)) != NULL) { - /*do we have real child */ - if (strcmp(dirp->d_name, ".") && - strcmp(dirp->d_name, "..") && - strcmp(dirp->d_name, MOD_NAME) && /* XXX */ - strncmp(dirp->d_name, ".wh.", 4) ) - break; - } - if (dirp == NULL) { - /* no real children left */ - /* kill parent also */ - remove_rf(FALSE); - } - exit(0); - } - /*not tag */ - push_path(&t_path, DEF_NAME); - if (lstat(t_path.path, &statbuf) >= 0 && - (statbuf.st_mode & S_IFMT) == S_IFREG) { - /* defniition present */ - if ((status = parse_def(&def, t_path.path, FALSE))) { - bye("parse error: %d\n", status); - } - if (!def.tag && !def.multi && def.def_type!= ERROR_TYPE) { - /* signgle value */ - /* is it modified == - it is in C, but not OPAQUE */ - switch_path(CPATH); - if(lstat(m_path.path, &statbuf) >= 0) { - push_path(&m_path, OPQ_NAME); - if(lstat(m_path.path, &statbuf) < 0) { - /* yes remove from C only */ - pop_path(&m_path); - remove_rf(TRUE); - exit(0); - } - pop_path(&m_path); /*OPQ_NAME */ - } - switch_path(MPATH); - } - } - /* else no defnition, remove it also */ - char *def_val; - def_val = malloc(1025); - if (has_default(&def_val,1024) == 0) { - reset_default(def_val); - free(def_val); - } - else { - remove_rf(FALSE); - } - - // remove_rf(FALSE); - exit(0); - } - if(ai < argc -1 || last_tag) { - fprintf(out_stream, "The specified configuration node is not valid\n"); - bye("There is no appropriate template for %s", - m_path.path + strlen(get_mdirp())); - } - /*ai == argc -1, must be actual value */ - pop_path(&m_path); /*it was value, not path segment */ - push_path(&m_path, VAL_NAME); - /* set value */ - if (lstat(m_path.path, &statbuf) < 0) { - fprintf(out_stream, "Nothing to delete\n"); - bye("Nothing to delete at %s", m_path.path); - } - if ((statbuf.st_mode & S_IFMT) != S_IFREG) - bye("Not a regular file %s", m_path.path); - /* get definition to deal with potential multi */ - pop_path(&t_path); /* it was tag or real value */ - push_path(&t_path, DEF_NAME); - if (lstat(t_path.path, &statbuf) < 0 || - (statbuf.st_mode & S_IFMT) != S_IFREG) { - fprintf(out_stream, "The specified configuration node is not valid\n"); - bye("Can not delete value, no definition for %s", m_path.path); - } - /* defniition present */ - if ((status = parse_def(&def, t_path.path, FALSE))) { - bye("parse error: %d\n", status); - } - if (def.multi) { - /* delete from multivalue */ - valstruct new_value, old_value; - status = char2val(&def, argv[argc - 1], &new_value); - if (status) - exit(0); - cp = NULL; - pop_path(&m_path); /* get_value will push VAL_NAME */ - status = get_value(&cp, &m_path); - if (status != VTWERR_OK) - bye("Cannot read old value %s\n", m_path.path); - status = char2val(&def, cp, &old_value); - if (status != VTWERR_OK) - bye("Corrupted old value ---- \n%s\n-----\n", cp); - res = val_cmp(&new_value, &old_value, IN_COND); - if (!res) { - fprintf(out_stream, "%s is not a configured value, %s\n", new_value.val,old_value.val); - bye("Not in multivalue"); - } - touch(); - if (old_value.cnt) { - push_path(&m_path, VAL_NAME); - fp = fopen(m_path.path, "w"); - if (fp == NULL) - bye("Can not open value file %s", m_path.path); - if (is_in_cond_tik()) { - for(delp=cp;delp && is_in_cond_tik(); dec_in_cond_tik()) { - delp = strchr(delp, '\n'); - if (!delp) - INTERNAL; - ++delp; /* over \n */ - } - /* write "left" of deleted */ - fwrite(cp, 1, delp-cp, fp); - }else - delp = cp; - /* find end of value */ - endp = strchr(delp, '\n'); - if (endp && *++endp) { - /* write "right" of deleted */ - fwrite(endp, 1, strlen(endp), fp); - /* need the final '\n' */ - fwrite("\n", 1, 1, fp); - } - fclose(fp); - return 0; - } - /* it multi with only 1 value, remove */ - remove_rf(FALSE); - return 0; - } - - /* - let's do a new check here: - -> if this is a leaf and there is a value look for a match of the value - -> make sure to check existing configuration as well as uncommitted config - */ - if (ai+1 == argc) { - //does this work up until the last value - pop_path(&m_path); - if(lstat(m_path.path, &statbuf) == 0) { - //now compare last value with that in the node.def file to determine whether to accept this delete - status = get_value(&cp, &m_path); - if (status != VTWERR_OK) { - bye("Cannot read old value %s\n", m_path.path); - } - if (!strcmp(cp,argv[argc - 1])) { - /* Also need to handle the case where the value is not specified. */ - char *def_val; - def_val = malloc(1025); - if (has_default(&def_val,1024) == 0) { - reset_default(def_val); - free(def_val); - } - else { - remove_rf(FALSE); - } - return 0; - } - } - } - - - fprintf(out_stream, "The specified configuration node is not valid\n"); - bye("There is no appropriate template for %s", - m_path.path + strlen(get_mdirp())); - - return 1; -} - |