/* -*- LPC -*- */ /* * $Id: rcso_ut.c,v 1.12 2003/04/23 20:58:33 pinkfish Exp $ */ inherit "/cmds/base"; #include <creator.h> #define CMD_NUM 3 mapping globals = ([]), files = ([]), ret = ([]); #define TP globals[fd] #define RET ret[fd] mixed cmd(string arg) { int fd, nfiles = 0; int force; string cmd; string bit, *bits; object *things; if(!arg) { return notify_fail("rcsout: No arguments.\n"); } bits = explode(arg, " "); arg = ""; bits -= ({""}); if (bits[0] == "-f") { force = 1; bits = bits[1..]; } foreach(bit in bits){ string *files = ({ }), file; if (bit[0] == '-'){ arg += (" " + bit); continue; } if (sizeof(things = WIZ_PRESENT->wiz_present(bit, this_player()))) { int i; files = uniq_array(map(things, (: base_name($1) :))); for (i = 0; i < sizeof(files); i++) { if (file_size(files[i]) <= 0) { files[i] += ".c"; } } } files += this_player()->get_files(bit); if (!sizeof(files)) { file = this_player()->get_path(bit); if(master()->valid_write(file, geteuid(this_player()), "cmd")) { arg += (" " + file[1..]); nfiles++; } else { notify_fail("You do not have write access to "+file+"\n"); } } else { foreach(file in uniq_array(files)) { if(master()->valid_write(file, geteuid(this_player()), "cmd")) { arg += (" " + file[1..]); nfiles++; } else { notify_fail("You do not have write access to "+file+"\n"); } } } } if(!nfiles) { return 0; } if (force) { cmd = " -l -f -w" + this_player()->query_name() +arg; } else { cmd = " -l -w" + this_player()->query_name() +arg; } #ifdef DEBUG printf("CMD: %s\n", cmd); #endif fd = external_start(CMD_NUM, cmd, "read_call_back", "write_call_back", "close_call_back"); TP = this_player(); RET = ""; return 1; } void read_call_back(int fd, mixed mess) { mess = replace(mess, "/home/atuin/lib", ""); RET += mess; } void write_call_back(int fd) { tell_object(TP, "rcsout: Whoops! fatal error.\n"); } void close_call_back(int fd) { string file, *file_stuff; int i; if(RET != "") { TP->more_string(RET); file_stuff = explode(RET, "\n"); i = 0; while (i + 2 < sizeof(file_stuff)) { if (file_stuff[i + 2] == "done") { /* success! */ sscanf(file_stuff[i], "%*s --> %s", file); RCS_HANDLER->add_lock(TP, file); i += 3; } else if (sscanf(file_stuff[i], "%*sNo such file or directory")) { ++i; } else if (file_stuff[i + 1][0 .. 2] == "co:") i += 2; else i += 3; } } else tell_object(TP, "rcsout completed.\n"); map_delete(ret, fd); map_delete(globals, fd); }