/* -*- LPC -*- */ /* * $Locker: $ * $Id: cloner.c,v 1.4 2001/08/17 00:32:27 ceres Exp $ */ inherit "/cmds/base"; #define CLONER "/global/cloner" #define LIFE_TIME 7257600 int do_list(string file) { string *files, change; mapping changes; string ret; if(file && file != "") { files = this_player()->get_files(file); } changes = CLONER->query_changes(); ret = ""; foreach(change in keys(changes)) { if(files && member_array(change, files) == -1 && strsrch(change, file) == -1) { continue; } ret += sprintf("%s:\n %s until %s\n", change, changes[change][0], ctime(changes[change][1] + LIFE_TIME)); } this_player()->more_string( ret, "Cloner list", 1 ); return 1; } int do_move(string source, string dest) { string *sources, *tmp, destp, rcs; seteuid(geteuid(this_player())); sources = this_player()->get_files(source); if(!sizeof(sources)) return notify_fail("No source files found.\n"); destp = this_player()->get_path(dest); if(file_size(destp) != -2 && !mkdir(dest)) return notify_fail("Destination must be a directory.\n"); foreach(source in sources) { if(file_size(source) == -2 || file_size(source) == -1) { if(source[<4..] == "/RCS") { if(rename(source, source+".tmp")) return notify_fail("Error moving RCS directory to temp location.\n"); else rcs = source+".tmp"; } else write("Not moving directory: " + source + "\n"); } else { tmp = explode(source, "/"); dest = destp + "/" + tmp[sizeof(tmp)-1]; if(rename(source, dest)) return notify_fail("Error renaming [" + source + "] to [" + dest + "]\n"); CLONER->add_mapping(source, dest); } } if(rcs && rename(rcs, destp + "/RCS")) return notify_fail("Error moving RCS directory.\n"); return 1; } int do_add(string source, string dest) { CLONER->add_mapping(source, dest); return 1; } int do_remove(string source) { CLONER->remove_mapping(source); return 1; } mixed *query_patterns() { return ({ "list", (: do_list(0) :), "list <word'file'>", (: do_list($4[0]) :), "move <word'source'> <word'dest'>", (: do_move($4[0], $4[1]) :), "add <word'source'> <word'dest'>", (: do_add($4[0], $4[1]) :), "remove <word'source'>", (: do_remove($4[0]) :), }); }