diff options
Diffstat (limited to 'xlators/features/protect/src/prot_client.c')
| -rw-r--r-- | xlators/features/protect/src/prot_client.c | 213 | 
1 files changed, 0 insertions, 213 deletions
diff --git a/xlators/features/protect/src/prot_client.c b/xlators/features/protect/src/prot_client.c deleted file mode 100644 index 79636410b94..00000000000 --- a/xlators/features/protect/src/prot_client.c +++ /dev/null @@ -1,213 +0,0 @@ -/* -   Copyright (c) 2013 Red Hat, Inc. <http://www.redhat.com> -   This file is part of GlusterFS. - -   This file is licensed to you under your choice of the GNU Lesser -   General Public License, version 3 or any later version (LGPLv3 or -   later), or the GNU General Public License, version 2 (GPLv2), in all -   cases as published by the Free Software Foundation. -*/ -#include "xlator.h" -#include "defaults.h" - -#ifdef HAVE_BACKTRACE -#include <execinfo.h> -#else -#include "execinfo_compat.h" -#endif - -#define NUM_FRAMES 20 - -static char PROTECT_KEY[] = "trusted.glusterfs.protect"; - -enum { -        PROT_ACT_NONE = 0, -        PROT_ACT_LOG, -        PROT_ACT_REJECT, -}; - -void -pcli_print_trace (char *name, call_frame_t *frame) -{ -        void    *frames[NUM_FRAMES]; -        char    **symbols; -        int     size; -        int     i; - -        gf_log (name, GF_LOG_INFO, "Translator stack:"); -        list_for_each_entry (frame, &frame->root->myframes, frames) { -                gf_log (name, GF_LOG_INFO, "%s (%s)", -                        frame->wind_from, frame->this->name); -        } - -        size = backtrace (frames, NUM_FRAMES); -        if (size <= 0) { -                return; -        } -        symbols = backtrace_symbols (frames, size); -        if (!symbols) { -                return; -        } - -        gf_log (name, GF_LOG_INFO, "Processor stack:"); -        for (i = 0; i < size; ++i) { -                gf_log (name, GF_LOG_INFO, "%s", symbols[i]); -        } -        free (symbols); -} - -int32_t -pcli_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, -                loc_t *newloc, dict_t *xdata) -{ -        uint64_t        value; - -        if (newloc->parent == oldloc->parent) { -                gf_log (this->name, GF_LOG_DEBUG, "rename in same directory"); -                goto simple_unwind; -        } -        if (!oldloc->parent) { -                goto simple_unwind; -        } -        if (inode_ctx_get (oldloc->parent, this, &value) != 0) { -                goto simple_unwind; -        } - -        if (value != PROT_ACT_NONE) { -                gf_log (this->name, GF_LOG_WARNING, -                        "got rename for protected %s", oldloc->path); -                pcli_print_trace (this->name, frame); -                if (value == PROT_ACT_REJECT) { -                        STACK_UNWIND_STRICT (rename, frame, -1, EPERM, -                                             NULL, NULL, NULL, NULL, NULL, -                                             xdata); -                        return 0; -                } -        } - -simple_unwind: -        STACK_WIND_TAIL (frame, FIRST_CHILD(this), -                         FIRST_CHILD(this)->fops->rename, oldloc, newloc, -                         xdata); -        return 0; -} - -int32_t -pcli_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, -               int32_t flags, dict_t *xdata) -{ -        data_t          *data; -        uint64_t        value; - -        /* -         * We can't use dict_get_str and strcmp here, because the value comes -         * directly from the user and might not be NUL-terminated (it would -         * be if we had set it ourselves. -         */ - -        data = dict_get(dict,PROTECT_KEY); -        if (!data) { -                goto simple_wind; -        } - -        if (dict->count > 1) { -                gf_log (this->name, GF_LOG_WARNING, -                        "attempted to mix %s with other keys", PROTECT_KEY); -                goto simple_wind; -        } - -        gf_log (this->name, GF_LOG_DEBUG, "got %s request", PROTECT_KEY); -        if (!strncmp(data->data,"log",data->len)) { -                gf_log (this->name, GF_LOG_DEBUG, -                        "logging removals on %s", loc->path); -                value = PROT_ACT_LOG; -        } -        else if (!strncmp(data->data,"reject",data->len)) { -                gf_log (this->name, GF_LOG_DEBUG, -                        "rejecting removals on %s", loc->path); -                value = PROT_ACT_REJECT; -        } -        else { -                gf_log (this->name, GF_LOG_DEBUG, -                        "removing protection on %s", loc->path); -                value = PROT_ACT_NONE; -        } -        /* Right now the value doesn't matter - just the presence. */ -        if (inode_ctx_set(loc->inode,this,&value) != 0) { -                gf_log (this->name, GF_LOG_WARNING, -                        "failed to set protection status for %s", loc->path); -        } -        STACK_UNWIND_STRICT (setxattr, frame, 0, 0, NULL); -        return 0; - -simple_wind: -        STACK_WIND_TAIL (frame, -                         FIRST_CHILD(this), FIRST_CHILD(this)->fops->setxattr, -                         loc, dict, flags, xdata); -        return 0; -} - -int32_t -pcli_unlink (call_frame_t *frame, xlator_t *this, loc_t *loc, int xflag, -             dict_t *xdata) -{ -        uint64_t        value; - -        if (!loc->parent || (inode_ctx_get(loc->parent,this,&value) != 0)) { -                goto simple_unwind; -        } - -        if (value != PROT_ACT_NONE) { -                gf_log (this->name, GF_LOG_WARNING, -                        "got unlink for protected %s", loc->path); -                pcli_print_trace(this->name, frame); -                if (value == PROT_ACT_REJECT) { -                        STACK_UNWIND_STRICT (unlink, frame, -1, EPERM, -                                             NULL, NULL, NULL); -                        return 0; -                } -        } - -simple_unwind: -        STACK_WIND_TAIL (frame, FIRST_CHILD(this), -                         FIRST_CHILD(this)->fops->unlink, loc, xflag, xdata); -        return 0; -} - -int32_t -init (xlator_t *this) -{ -        if (!this->children || this->children->next) { -                gf_log (this->name, GF_LOG_ERROR, -                        "translator not configured with exactly one child"); -                return -1; -        } - -        if (!this->parents) { -                gf_log (this->name, GF_LOG_WARNING, -                        "dangling volume. check volfile "); -        } - -        return 0; -} - - -void -fini (xlator_t *this) -{ -        return; -} - - -struct xlator_fops fops = { -        .rename         = pcli_rename, -        .setxattr       = pcli_setxattr, -        .unlink         = pcli_unlink, -}; - -struct xlator_cbks cbks = { -}; - -struct volume_options options[] = { -        { .key = {NULL} }, -};  | 
