// File : cmds/xtra/_chsh.c
// Creator : Watcher @ TMI
//
// Command used to set user shell from choices found in
// reserved SHELL directory.
#include <mudlib.h>
inherit DAEMON ;
#define SHELL_LIST "/adm/etc/shells"
#define NAME (string) this_player()->query("cap_name")
#define SYNTAX "Syntax: chsh [shell | ?]\n"
static string get_shell();
static int input_shell(string str);
static int list_shells();
static int load_shells();
string *SHELLS;
int cmd_chsh(string str) {
if(!SHELLS) load_shells();
if(str == "?") return list_shells();
if(str && str != "") return input_shell(str);
write("Changing login shell for " + NAME + ".\nShell [" +
get_shell() + "]: ");
input_to("input_shell");
return 1; }
static int input_shell(string str) {
object shell;
string old_shell;
int loop;
if(!str || str == "") {
write("Login shell unchanged.\n");
return 1; }
old_shell = (string) this_player()->query("shell");
if(str == "none") str = 0;
else {
if (str[<2..<1] != ".c") str += ".c";
if(member_array(str, SHELLS) == -1) {
write("Invalid shell selection, shell unchanged.\n");
write(list_shells());
return 1;
}
}
if((string)this_player()->query("shell") == str) {
write("Login shell unchanged.\n");
return 1; }
this_player()->set("shell", str);
if(!str) write("Login shell removed.\n");
else write("Login shell changed.\n");
shell = present("shell", this_player());
if(shell && (base_name(shell) + ".c") == old_shell) shell->remove();
if(str && catch(clone_object(str)->move(this_player())))
write("Chsh: Error in shell creation.\n");
return 1; }
static string get_shell() {
string tmp;
tmp = (string)this_player()->query("shell");
if(!tmp || tmp == "") tmp = "none";
return tmp; }
static int load_shells() {
string list;
int loop;
list = read_file(SHELL_LIST);
if(!list) return 0;
SHELLS = explode(list, "\n");
for(loop=sizeof(SHELLS)-1; loop>-1; loop--)
if(SHELLS[loop][0] == '#' || SHELLS[loop] == "")
SHELLS = exclude_array(SHELLS, loop);
return 1; }
static int list_shells() {
int loop;
write("Available shell environments:\t");
for(loop=0; loop<sizeof(SHELLS); loop++) {
if(loop) write("\t\t\t\t");
write(SHELLS[loop] + "\n");
}
write("\t\t\t\tnone\n\n");
return 1; }
string help() {
return(SYNTAX+"\n"+@HELP
This command allows a user to change their shell working environment.
The choices can be listed with "?" as a shell argument.
See also: shell, term
HELP
);
}