/*
* this does an ls, now that get_dir has been written
* Modified by Turrican 13-7-95 with nicked code from TMI-2's ftpd.
* - Added different options.
* Modified by Dyraen@Rod, made external. 5-Nov-95
*/
#include <standard.h>
#include <cmd.h>
#include <ls.h>
#define FPERM "/secure/fperm"
#define CREATOR (master()->author_file(sprintf("%s/%s", str, direc[i][0]))? \
master()->author_file(sprintf("%s/%s", str, direc[i][0])): \
"Root")
#define DOMAIN (master()->domain_file(sprintf("%s/%s", str, direc[i][0]))? \
master()->domain_file(sprintf("%s/%s", str, direc[i][0])): \
"Root")
#define CREATOR_D (master()->author_file(sprintf("%s/%s/.", str, direc[i][0]))? \
master()->author_file(sprintf("%s/%s/.", str, direc[i][0])): \
"Root")
#define DOMAIN_D (master()->domain_file(sprintf("%s/%s/.", str, direc[i][0]))? \
master()->domain_file(sprintf("%s/%s/.", str, direc[i][0])): \
"Root")
inherit CMD_BASE;
object tp;
void setup() {
position = CREATOR_CMD;
}
string query_usage() {
return "-acdflopCF [directory|filename]";
}
string query_short_help() {
return "List files in current or specified directories";
}
string dir_entry(string path, string name, int mask, object me) {
int size;
string *obs, tmp;
size = file_size(me->get_path(path+name));
if (size == -2) {
obs = get_dir((tmp = me->get_path(path+name))+
(tmp == "/"?"":"/"));
if (!obs)
size = -1;
else
size = sizeof(obs);
if (mask & MASK_F)
name += "/";
} else {
if (virtual_find_object(path+name)) {
if (mask & MASK_F)
name += "*";
}
size = (size / 1024) + 1;
}
if (size < 1000)
return " "[0..3-strlen(size+"")]+size+" "+name;
return size+" "+name;
} /* dir_entry() */
int ls(string str, int mask, object me) {
string *direc, *bit, *bing, bong, path;
int i, j, k, size;
seteuid(geteuid(me));
path = str;
if (file_size(str) == -2 && str[strlen(str)-1] != '/' && !(mask & MASK_D))
path += "/";
if (mask & MASK_A)
path += "*";
direc = get_dir(path);
if (!direc) {
notify_fail("No files..\n");
return 0;
}
if (!sizeof(direc)) {
notify_fail("No files.\n");
return 0;
}
if (file_size(path) == -2) {
if (path[strlen(path)-1] != '/')
path += "/";
} else {
bit = explode(path, "/");
bit = bit[0..sizeof(bit)-2];
path = "/"+implode(bit,"/")+"/";
}
if(path == "//")
path = "/";
write("Dir of: "+path+"\n");
bing = allocate(sizeof(direc));
j = sizeof(direc);
if (!(mask & MASK_A))
direc = filter_array(direc, "check_dots", this_object(), 0);
if (!(mask & MASK_C) && !(mask & MASK_L)) {
if (!(mask & MASK_F) && !(mask & MASK_O)) {
bong = sprintf("%-=*s\n", me->query_cols(),
implode(direc, "\n"));
bing = explode(bong, "\n");
}
else for (i=0; i < j; i++) {
if (file_size(path+direc[i]) == -2 || direc[i] == "..")
if (mask & MASK_O)
bing[i] = sprintf("%s%-=*s", "%^GREEN%^",
(int)me->query_cols()+8, direc[i]+"%^RESET%^"+
(mask & MASK_F?"/":""));
else
bing[i] = sprintf("%-=*s", me->query_cols(),
direc[i]+"/");
else if (virtual_find_object(path+direc[i]))
if (mask & MASK_O)
bing[i] = sprintf("%s%-=*s", "%^MAGENTA%^",
(int)me->query_cols()-1, direc[i]+"%^RESET%^"+
(mask & MASK_F?"*":""));
else
bing[i] = sprintf("%-=*s", me->query_cols(),
direc[i]+"*");
else
bing[i] = sprintf("%-=*s", me->query_cols(), direc[i]);
}
bong = implode(bing, "\n");
} else if (!(mask & MASK_L)) {
j = sizeof(direc);
for ( i = 0; i < j; i++ ) {
if ( strlen( direc[ i ] ) > 35 ) {
write(dir_entry(path, direc[i], mask, me)+"\n");
bing = delete(bing, i, 1);
direc = delete(direc, i--, 1);
j--;
continue;
} else
bing[i] = dir_entry(path, direc[i], mask, me)+"\n";
}
bong = sprintf( "%#-*s\n", me->query_cols(),
implode(bing, ""));
if (mask & MASK_O) {
/* Boy, it's hard to work with colors and sprintf. *sigh*
*especially* in column mode :-( */
i = j;
while (i--) {
if (file_size(path+direc[i]) == -2 || direc[i] == "..")
bong = replace_string(bong, " "+direc[i],
sprintf(" %s%s%s", "%^GREEN%^", direc[i], "%^RESET%^"));
else if (virtual_find_object(path+direc[i]))
bong = replace_string(bong, " "+direc[i],
sprintf(" %s%s%s", "%^MAGENTA%^", direc[i], "%^RESET%^"));
else
/* Believe me, it's needed. */
bong = replace_string(bong, " "+direc[i],
sprintf(" %s%s", "%^WHITE%^", direc[i]));
}
}
} else {
string tmp, tmp2, fname;
mixed *stats;
int *count;
object loaded;
/* if path is a directory get contents */
if ( file_size( str ) == -2 && !(mask & MASK_D)) {
if ( str[ strlen( str ) - 1 ] == '/' )
str += "*";
else
str += "/*";
}
/* begin long "list" */
direc = get_dir( str, -1 );
if (!(mask & MASK_A))
direc = filter_array(direc, "check_dots", this_object(), 1);
if (!direc || !(size = sizeof(direc)))
return 0;
bit = allocate(size);
count = allocate(size);
i = strsrch(str, '/', -1);
if (i >= 0)
str = str[0..i];
for (i = 0; i < size; i++) {
reset_eval_cost();
/* process timestamp */
tmp2 = ctime((direc[i])[2]); /* get last modified timestamp */
if ((direc[i])[2] + (365 * 24 * 60 * 60) < time()) {
/* MMM DD YYYY */
tmp = sprintf("%s %s", tmp2[4..9], tmp2[20..23]);
} else {
/* MMM DD hh:mm */
tmp = tmp2[4..15];
}
j = (direc[i])[1]; /* get filesize */
if (j == -2) {
count[i] = 1;
/* directory */
bit[i] = sprintf("%-=*s", (me->query_cols()+
(mask & MASK_O?17:0)),
sprintf("drwxr%cx%c%c%c %3d %-11.11s %-11.11s [%4d] %12s %s%s%s%s",
(master()->valid_write(sprintf("%s%s/fl.uff",str,direc[i][0]),
DOMAIN_D, "get_dir")?'w':'-'),
(master()->valid_read(sprintf("%s%s",str,direc[i][0]),
"NOBODY", "get_dir")?'r':'-'),
(master()->valid_write(sprintf("%s%s/fl.uff",str,direc[i][0]),
"NOBODY", "get_dir")?'w':'-'),
(master()->valid_read(sprintf("%s%s",str,direc[i][0]),
"NOBODY", "get_dir")?'x':'-'),
sizeof(filter_array((get_dir(me->get_path(
sprintf("%s%s/*", str, direc[i][0])))?get_dir(
me->get_path(sprintf("%s%s/*", str, direc[i][0]))):({ })),
"is_dir", this_object(),
sprintf("%s%s", str, direc[i][0])))+(direc[i][0..1] == ".." &&
str == "/"?2:0),
/*
(FPERM->query_fperms(str+direc[i][0])?
FPERM->query_fperms(str+direc[i][0])[0]:CREATOR_D), DOMAIN_D,
*/
CREATOR,DOMAIN,
sizeof(get_dir(me->get_path(sprintf("%s%s/*", str, direc[i][0])))),
tmp, (mask & MASK_O?"%^GREEN%^":""),
(direc[i][0]), (mask & MASK_O?"%^RESET%^":""),
(mask & MASK_F?"/":"")));
} else {
/* file */
count[i] = 0;
fname = (""+direc[i][0])[0..19];
loaded = virtual_find_object(str+direc[i][0]);
bit[i] = sprintf("%-=*s", (me->query_cols()+
((mask & MASK_O) && loaded?19:0)),
sprintf("-rw%c%c%c-%c%c- 1 %-11.11s %-11.11s %6d %12s %s%s%s%s",
(loaded ? 'x' : '-'),
(master()->valid_read(sprintf("%s/%s",str,direc[i][0]),
DOMAIN, "get_dir")?'r':'-'),
(master()->valid_write(sprintf("%s/%s",str,direc[i][0]),
DOMAIN, "get_dir")?'w':'-'),
(master()->valid_read(sprintf("%s/%s",str,direc[i][0]),
"NOBODY", "get_dir")?'r':'-'),
(master()->valid_write(sprintf("%s/%s",str,direc[i][0]),
"NOBODY", "get_dir")?'w':'-'),
/*
(FPERM->query_fperms(str+direc[i][0])?
FPERM->query_fperms(str+direc[i][0])[0]:CREATOR),DOMAIN, j, tmp,
*/
CREATOR,DOMAIN, j, tmp,
((mask & MASK_O) && loaded?"%^MAGENTA%^":""),
fname, ((mask & MASK_O) &&
loaded?"%^RESET%^":""),
(loaded?(mask & MASK_F?"*":""):"")));
}
bong = implode(bit, "\n");
}
}
if (mask & MASK_P)
me->more_string( bong, str );
else
write(bong+"\n");
return 1;
} /* ls() */
int check_dots(mixed arg, int flag) {
if (flag)
return (arg[0][0..0] != "." );
return (arg[0..0] != "." );
}
int is_dir(mixed arg, string path) {
if (!tp)
return (file_size(this_player()->get_path(sprintf("%s/%s", path, arg)))
== -2);
else
return (file_size(tp->get_path(sprintf("%s/%s", path, arg))) == -2);
}
static int cmd(string str, object me) {
string flags;
int mask, i;
tp = me;
if (!str) str = "";
if ( (sscanf(str,"-%s %s",flags,str) == 2) ||
(sscanf(str,"-%s", flags) == 1) )
for (i=0;i<strlen(flags);i++)
switch(flags[i..i]) {
case "a": mask |= MASK_A;
break;
case "C":
case "c": mask |= MASK_C;
break;
case "d": mask |= MASK_D;
break;
case "F":
case "f": mask |= MASK_F;
break;
case "l": mask |= MASK_L;
break;
case "o": mask |= MASK_O;
break;
case "p": mask |= MASK_P;
break;
default:
}
if (!mask) mask = 42;
if (str[0..0] == "-") str = "";
str = me->get_path(str);
return ls(str, mask, me);
} /* cmd() */