/*
* Copyright (C) 2010 Vyatta, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
static int op_idx = -1;
static const char *op_bin_name[] = {
"my_set",
"my_delete",
"my_activate",
"my_deactivate",
"my_rename",
"my_copy",
"my_comment",
"my_discard",
"my_move",
NULL
};
static const char *op_Str[] = {
"Set",
"Delete",
"Activate",
"Deactivate",
"Rename",
"Copy",
"Comment",
"Discard",
"Move",
NULL
};
static const char *op_str[] = {
"set",
"delete",
"activate",
"deactivate",
"rename",
"copy",
"comment",
"discard",
"move",
NULL
};
static const bool op_need_cfg_node_args[] = {
true,
true,
true,
true,
true,
true,
true,
false,
true,
false // dummy
};
#define OP_Str op_Str[op_idx]
#define OP_str op_str[op_idx]
#define OP_need_cfg_node_args op_need_cfg_node_args[op_idx]
static void
doSet(Cstore& cstore, const vector& path_comps)
{
if (!cstore.validateSetPath(path_comps)) {
bye("invalid set path\n");
}
if (!cstore.setCfgPath(path_comps)) {
bye("set cfg path failed\n");
}
}
static void
doDelete(Cstore& cstore, const vector& path_comps)
{
vtw_def def;
if (!cstore.validateDeletePath(path_comps, def)) {
bye("invalid delete path");
}
if (!cstore.deleteCfgPath(path_comps, def)) {
bye("delete failed\n");
}
}
static void
doActivate(Cstore& cstore, const vector& path_comps)
{
if (!cstore.validateActivatePath(path_comps)) {
bye("%s validate failed", OP_str);
}
if (!cstore.unmarkCfgPathDeactivated(path_comps)) {
bye("%s failed", OP_str);
}
}
static void
doDeactivate(Cstore& cstore, const vector& path_comps)
{
if (!cstore.validateDeactivatePath(path_comps)) {
bye("%s validate failed", OP_str);
}
if (!cstore.markCfgPathDeactivated(path_comps)) {
bye("%s failed", OP_str);
}
}
static void
doRename(Cstore& cstore, const vector& path_comps)
{
if (!cstore.validateRenameArgs(path_comps)) {
bye("invalid rename args\n");
}
if (!cstore.renameCfgPath(path_comps)) {
bye("rename cfg path failed\n");
}
}
static void
doCopy(Cstore& cstore, const vector& path_comps)
{
if (!cstore.validateCopyArgs(path_comps)) {
bye("invalid copy args\n");
}
if (!cstore.copyCfgPath(path_comps)) {
bye("copy cfg path failed\n");
}
}
static void
doComment(Cstore& cstore, const vector& path_comps)
{
vtw_def def;
if (!cstore.validateCommentArgs(path_comps, def)) {
bye("invalid comment args\n");
}
if (!cstore.commentCfgPath(path_comps, def)) {
bye("comment cfg path failed\n");
}
}
static void
doDiscard(Cstore& cstore, const vector& args)
{
if (args.size() > 0) {
OUTPUT_USER("Invalid discard command\n");
bye("invalid discard command\n");
}
if (!cstore.discardChanges()) {
bye("discard failed\n");
}
// special case for discard: don't return (don't want to mark changed)
exit(0);
}
static void
doMove(Cstore& cstore, const vector& path_comps)
{
if (!cstore.validateMoveArgs(path_comps)) {
bye("invalid move args\n");
}
if (!cstore.moveCfgPath(path_comps)) {
bye("move cfg path failed\n");
}
}
typedef void (*OpFuncT)(Cstore& cstore,
const vector& path_comps);
OpFuncT OpFunc[] = {
&doSet,
&doDelete,
&doActivate,
&doDeactivate,
&doRename,
&doCopy,
&doComment,
&doDiscard,
&doMove,
NULL
};
int
main(int argc, char **argv)
{
int i = 0;
while (op_bin_name[i]) {
if (strcmp(basename(argv[0]), op_bin_name[i]) == 0) {
op_idx = i;
break;
}
++i;
}
if (op_idx == -1) {
printf("Invalid operation\n");
exit(-1);
}
if (initialize_output(OP_Str) == -1) {
bye("can't initialize output\n");
}
if (OP_need_cfg_node_args && argc < 2) {
fprintf(out_stream, "Need to specify the config node to %s\n", OP_str);
bye("nothing to %s\n", OP_str);
}
// actual CLI operations use the edit levels from environment, so pass true.
UnionfsCstore cstore(true);
vector path_comps;
for (int i = 1; i < argc; i++) {
path_comps.push_back(argv[i]);
}
// call the op function
OpFunc[op_idx](cstore, path_comps);
cstore.markCfgPathChanged(path_comps);
exit(0);
}