- (void) sprintf(fsize, "%8ld", p->fsize);
-/* get ftime */
- { char *cp = ctime(&p->fmtime);
- if ((p->fmtime < sixmonthsago) || (p->fmtime > now))
- (void) sprintf(ftime, " %-7.7s %-4.4s ", cp+4, cp+20);
- else
- (void) sprintf(ftime, " %-12.12s ", cp+4);
- }
-/* splat */
- *lp++ = p->ftype;
- lp = fmtmode(lp, p->fflags);
- (void) sprintf(lp, "%3d %s%s%s%s",
- p->fnl, uname, gflg ? gname : "", fsize, ftime);
- return (lstuffbuf);
-}
-
-int m1[] = { 1, S_IREAD>>0, 'r', '-' };
-int m2[] = { 1, S_IWRITE>>0, 'w', '-' };
-int m3[] = { 2, S_ISUID, 's', S_IEXEC>>0, 'x', '-' };
-int m4[] = { 1, S_IREAD>>3, 'r', '-' };
-int m5[] = { 1, S_IWRITE>>3, 'w', '-' };
-int m6[] = { 2, S_ISGID, 's', S_IEXEC>>3, 'x', '-' };
-int m7[] = { 1, S_IREAD>>6, 'r', '-' };
-int m8[] = { 1, S_IWRITE>>6, 'w', '-' };
-int m9[] = { 2, S_ISVTX, 't', S_IEXEC>>6, 'x', '-' };
-
-int *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9};
-
-char *
-fmtmode(lp, flags)
- char *lp;
- int flags;
-{
- int **mp;
-
- for (mp = &m[0]; mp < &m[sizeof(m)/sizeof(m[0])]; ) {
- register int *pairp = *mp++;
- register int n = *pairp++;
-
- while (--n >= 0 && (flags&*pairp++) == 0)
- pairp++;
- *lp++ = *pairp;
- }
- return (lp);
-}
-
-/* rest should be done with nameserver or database */
-
-#include <pwd.h>
-#include <grp.h>
-#include <utmp.h>
-
-struct utmp utmp;
-#define NMAX (sizeof (utmp.ut_name))
-#define SCPYN(a, b) strncpy(a, b, NMAX)
-
-#define NUID 64 /* power of 2 */
-#define UIDMASK 0x3f
-#define NGID 300
-
-struct ncache {
- int uid;
- char name[NMAX+1];
-} nc[NUID];
-char outrangename[NMAX+1];
-int outrangeuid = -1;
-char groups[NGID][NMAX+1];
-char outrangegroup[NMAX+1];
-int outrangegid = -1;
-
-char *
-getname(uid)
-{
- register struct passwd *pw;
- struct passwd *getpwent();
- extern int _pw_stayopen;
- register int cp;
-
- _pw_stayopen = 1;
- cp = uid & UIDMASK;
- if (uid >= 0 && nc[cp].uid == uid && nc[cp].name[0])
- return (nc[cp].name);
- pw = getpwuid(uid);
- if (!pw)
- return (0);
- nc[cp].uid = uid;
- SCPYN(nc[cp].name, pw->pw_name);
- return (nc[cp].name);
-}
-
-char *
-getgroup(gid)
-{
- register struct group *gr;
- static init;
- struct group *getgrent();
-
- if (gid >= 0 && gid < NGID && groups[gid][0])
- return (&groups[gid][0]);
- if (gid >= 0 && gid == outrangegid)
- return (outrangegroup);
-rescan:
- if (init == 2) {
- if (gid < NGID)
- return (0);
- setgrent();
- while (gr = getgrent()) {
- if (gr->gr_gid != gid)
- continue;
- outrangegid = gr->gr_gid;
- SCPYN(outrangegroup, gr->gr_name);
- endgrent();
- return (outrangegroup);
- }
- endgrent();
- return (0);
- }
- if (init == 0)
- setgrent(), init = 1;
- while (gr = getgrent()) {
- if (gr->gr_gid < 0 || gr->gr_gid >= NGID) {
- if (gr->gr_gid == gid) {
- outrangegid = gr->gr_gid;
- SCPYN(outrangegroup, gr->gr_name);
- return (outrangegroup);
- }
- continue;
- }
- if (groups[gr->gr_gid][0])
- continue;
- SCPYN(groups[gr->gr_gid], gr->gr_name);
- if (gr->gr_gid == gid)
- return (&groups[gid][0]);
- }
- init = 2;
- goto rescan;