Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Posting-Version: version B 2.10.2 9/5/84; site baylor.UUCP
Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!think!harvard!seismo!ut-sally!ut-ngp!shell!neuro1!baylor!peter
From: peter@baylor.UUCP (Peter da Silva)
Newsgroups: net.sources
Subject: le.c
Message-ID: <401@baylor.UUCP>
Date: Thu, 15-Aug-85 13:02:06 EDT
Article-I.D.: baylor.401
Posted: Thu Aug 15 13:02:06 1985
Date-Received: Tue, 20-Aug-85 08:33:25 EDT
Distribution: net
Organization: Ancient Illuminated Seers of Bavaria
Lines: 468
Having recieved numerous (well, 2) requests for "le", here's the source offered
without comment. 4.2 people will undoubtedly have to patch it to handle the
crufty new directories, but I have done that for a descendent of this (a visual
shell) and it's no hassle. V7 people rejoice: it runs under that venerable
system. I have never tried to convert it ro its descendents fo SIII/SV, so
let me know what luck you have.
---- le.c -----
#include
#include
#include
#include
#include
#include
#include
#define D_DEV 01
#define D_INO 02
#define D_MODE 04
#define D_LINKS 010
#define D_UID 020
#define D_GID 040
#define D_RDEV 0100
#define D_SIZE 0200
#define D_ATIME 0400
#define D_MTIME 01000
#define D_CTIME 02000
#define D_SMODE 04000
#define D_SUID 010000
#define D_SGID 020000
#define FALSE 0
#define TRUE 1
#define MAXENTS 512
#define MAXID 64
struct entry {
struct direct e_dir;
char filler;
struct stat e_stat;
} entries[MAXENTS];
int nentries;
char *errname;
extern int errno;
int xerrno;
char *tab=" ";
long maxsize;
char sizstr[2][10] = {"%6lu%s","%6s%s"};
int dohead=0, dodir=1;
int flags = D_MODE|D_LINKS|D_UID|D_SIZE|D_MTIME;
char *emesg[3]={
"No such error",
#define TOO_MANY 1
"Too many directory entries",
0
};
getdir(dir)
char *dir;
{
int entcmp();
char *nameof();
FILE *fp;
int valid;
if(!(fp = fopen(dir, "r"))) {
errname=dir;
return FALSE;
}
maxsize=0L;
for(nentries=0;
nentries0;
nentries += valid) {
if(valid=entries[nentries].e_dir.d_ino?1:0) {
entries[nentries].filler=0;
if(stat(nameof(entries[nentries].e_dir.d_name, dir),
&entries[nentries].e_stat
)==-1
) {
fclose(fp);
errname=nameof(entries[nentries].e_dir.d_name,
dir);
return FALSE;
}
if(entries[nentries].e_stat.st_size>maxsize)
maxsize=entries[nentries].e_stat.st_size;
}
}
if(nentries>=MAXENTS) {
errno=0;
xerrno=TOO_MANY;
errname=dir;
return FALSE;
}
fclose(fp);
qsort(entries, nentries, sizeof(struct entry), entcmp);
setsize(maxsize);
return TRUE;
}
setsize(size)
long size;
{
char tmp[32];
int siz;
sprintf(tmp, "%lu", size);
siz=strlen(tmp);
if(siz<6) siz=6;
sprintf(sizstr[0], "%%%dlu%%s", siz);
sprintf(sizstr[1], "%%%ds%%s", siz);
if(dohead) {
header();
dohead=0;
}
}
char *
nameof(name, dir)
char *name, *dir;
{
char nambuf[BUFSIZ];
if(!dir[0])
return name;
if(dir[0]=='.' && !dir[1])
return name;
else if(dir[0]=='/' && !dir[1]) {
sprintf(nambuf, "/%s", name);
return nambuf;
} else {
sprintf(nambuf, "%s/%s", dir, name);
return nambuf;
}
}
pname(name)
char *name;
{
int len = 0;
for(;*name; name++)
if(*name<' ') { printf("^%c", *name+'@'); len+=2; }
else if(*name=='\0177') { printf("^?"); len+=2; }
else if(*name>'\0177') { printf("\\%03o", *name); len += 4; }
else { putchar(*name); len++; }
return len;
}
entcmp(e1, e2)
struct entry *e1, *e2;
{
return strcmp(e1->e_dir.d_name, e2->e_dir.d_name);
}
fdump(dir)
char *dir;
{
struct stat sbuf;
if(stat(dir, &sbuf)==-1) {
errname=dir;
return FALSE;
} else
if(dodir && (sbuf.st_mode&S_IFMT)==S_IFDIR) {
if(getdir(dir))
return dump(dir);
else
return FALSE;
} else {
setsize(sbuf.st_size);
statout(dir, &sbuf, ".");
return TRUE;
}
}
dump(dir)
char *dir;
{
int i, j;
int chars;
if(flags==0) {
for(i=0; i<=nentries/5; i++) {
chars = 0;
for(j=0; j<5; j++) {
if(i+j*nentries/5st_dev),
minor(sbuf->st_dev),
tab);
if(flags&D_RDEV)
printf("%3d,%3d%s",
major(sbuf->st_rdev),
minor(sbuf->st_rdev),
tab);
if(flags&D_INO)
printf("%5u%s", sbuf->st_ino, tab);
if(flags&D_SMODE)
printf("%6o%s", sbuf->st_mode, tab);
if(flags&D_MODE) {
int mode = sbuf->st_mode;
if((mode&S_IFMT)==S_IFCHR) putchar('c');
else if((mode&S_IFMT)==S_IFBLK) putchar('b');
else if((mode&S_IFMT)==S_IFDIR) putchar('d');
else if((mode&S_IFMT)==S_IFREG) putchar('-');
else putchar('?');
triad((mode>>6)&7, mode&S_ISUID, 's');
triad((mode>>3)&7, mode&S_ISGID, 's');
triad(mode&7, mode&S_ISVTX, 't');
printf("%s", tab);
}
if(flags&D_LINKS)
printf("%3u%s", sbuf->st_nlink, tab);
if(flags&D_SUID)
printf("%3d%s", sbuf->st_uid, tab);
if(flags&D_UID)
printf("%-8s%s", u_name(sbuf->st_uid), tab);
if(flags&D_SGID)
printf("%3d%s", sbuf->st_gid, tab);
if(flags&D_GID)
printf("%-8s%s", g_name(sbuf->st_gid), tab);
if(flags&D_SIZE)
printf(sizstr[0], sbuf->st_size, tab);
if((flags&~(D_ATIME|D_MTIME|D_CTIME)) &&
(flags&(D_ATIME|D_MTIME|D_CTIME))) putchar(' ');
if(flags&D_ATIME)
printime(&sbuf->st_atime);
if(flags&D_MTIME)
printime(&sbuf->st_mtime);
if(flags&D_CTIME)
printime(&sbuf->st_ctime);
pname(nameof(name, dir));
putchar('\n');
}
struct idtab {
int id_id;
char id_name[10];
} u_list[MAXID], g_list[MAXID];
int u_ptr=0, g_ptr=0;
char *
u_name(uid)
int uid;
{
int i;
struct passwd *pwptr, *getpwuid();
for(i=0; ipw_name[i]>' '; i++)
u_list[u_ptr].id_name[i]=pwptr->pw_name[i];
u_list[u_ptr].id_name[i]=0;
} else
sprintf(u_list[u_ptr].id_name, "%d", uid);
return u_list[u_ptr++].id_name;
}
char *
g_name(gid)
int gid;
{
int i;
struct group *grptr, *getgrgid();
for(i=0; igr_name[i]>' '; i++)
g_list[g_ptr].id_name[i]=grptr->gr_name[i];
g_list[g_ptr].id_name[i]=0;
} else
sprintf(g_list[g_ptr].id_name, "%d", gid);
return g_list[g_ptr++].id_name;
}
printime(clock)
long *clock;
{
struct tm *tmbuf, *localtime();
static char *months[12]= {
"Jan","Feb","Mar","Apr","May","Jun",
"Jul","Aug","Sep","Oct","Nov","Dec"
};
tmbuf=localtime(clock);
printf("%2d %3s %02d %2d:%02d %s",
tmbuf->tm_mday,
months[tmbuf->tm_mon],
tmbuf->tm_year,
tmbuf->tm_hour,
tmbuf->tm_min,
tab);
}
header()
{
if(flags&D_DEV)
printf("%7s%s", "IDev", tab);
if(flags&D_RDEV)
printf("%7s%s", "Rdev", tab);
if(flags&D_INO)
printf("%5s%s", "Inode", tab);
if(flags&D_SMODE)
printf("%6s%s", "Mode", tab);
if(flags&D_MODE)
printf("%-10s%s", "Long mode", tab);
if(flags&D_LINKS)
printf("%3s%s", "Lnx", tab);
if(flags&D_SUID)
printf("%3s%s", "UID", tab);
if(flags&D_UID)
printf("%-8s%s", "User", tab);
if(flags&D_SGID)
printf("%3s%s", "GID", tab);
if(flags&D_GID)
printf("%-8s%s", "Group", tab);
if(flags&D_SIZE)
printf(sizstr[1], "Size", tab);
if((flags&~(D_ATIME|D_MTIME|D_CTIME)) &&
(flags&(D_ATIME|D_MTIME|D_CTIME))) putchar(' ');
if(flags&D_ATIME)
printf("%-16s%s", "Access time", tab);
if(flags&D_MTIME)
printf("%-16s%s", "Modify time", tab);
if(flags&D_CTIME)
printf("%-16s%s", "Inode time", tab);
if(flags)
printf("%s\n", "File name");
}
triad(bits, special, code)
int bits, special;
char code;
{
if(bits&4) putchar('r');
else putchar('-');
if(bits&2) putchar('w');
else putchar('-');
if(special) putchar(code);
else if(bits&1) putchar('x');
else putchar('-');
}
main(ac, av)
int ac;
char **av;
{
int i, j;
int exit_status = 0;
int filed=0;
for(i=1; i