Install Luke's enhancements for finger.

By default, behave like the old ugly 4.4bsd finger and print office
information instead of remote login information.

It's an easy one line fix to make it behave like most other vendor's
fingers if we decide to change the default.

Reviewed by:	pst
This commit is contained in:
Paul Traina 1994-09-07 07:22:41 +00:00
parent 21b4fe120d
commit 86641d8f9c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=2537
6 changed files with 117 additions and 24 deletions

View File

@ -39,7 +39,7 @@
.Nd user information lookup program
.Sh SYNOPSIS
.Nm finger
.Op Fl lmsp
.Op Fl lmpsho
.Op Ar user ...
.Op Ar user@host ...
.Sh DESCRIPTION
@ -53,24 +53,41 @@ Options are:
.Nm Finger
displays the user's login name, real name, terminal name and write
status (as a ``*'' before the terminal name if write permission is
denied), idle time, login time, office location and office phone
number.
denied), idle time, login time, and either office location and office
phone number, or the remote host. If
.Fl h
is given, the remote host is printed (the default.) If
.Fl o
is given, the office location and office phone number is printed
instead.
.Pp
Idle time is in minutes if it is a single integer, hours and minutes
if a ``:'' is present, or days if a ``d'' is present.
Login time is displayed as month, day, hours and minutes, unless
more than six months ago, in which case the year is displayed rather
than the hours and minutes.
Login time is displayed as the dayname if less than 6 days, else month, day;
hours and minutes, unless more than six months ago, in which case the year
is displayed rather than the hours and minutes.
.Pp
Unknown devices as well as nonexistent idle and login times are
displayed as single asterisks.
.Pp
.It Fl h
When used in conjunction with the
.Fl s
option, the name of the remote host is displayed instead of the office
location and office phone.
.Pp
.It Fl o
When used in conjunction with the
.Fl s
option, the office location and office phone information is displayed
instead of the name of the remote host.
.Pp
.It Fl l
Produces a multi-line format displaying all of the information
described for the
.Fl s
option as well as the user's home directory, home phone number, login
shell, and the contents of the files
shell, mail status, and the contents of the files
.Dq Pa .forward ,
.Dq Pa .plan
and
@ -85,6 +102,7 @@ Phone numbers specified as eleven digits are printed as ``+N-NNN-NNN-NNNN''.
Numbers specified as ten or seven digits are printed as the appropriate
subset of that string.
Numbers specified as five digits are printed as ``xN-NNNN''.
Numbers specified as four digits are printed as ``xNNNN''.
.Pp
If write permission is denied to the device, the phrase ``(messages off)''
is appended to the line containing the device name.
@ -93,6 +111,11 @@ One entry per user is displayed with the
option; if a user is logged on multiple times, terminal information
is repeated once per login.
.Pp
Mail status is shown as ``No Mail.'' if there is no mail at all, ``Mail
last read DDD MMM ## HH:MM YYYY (TZ)'' if the person has looked at their
mailbox since new mail arriving, or ``New mail received ...'', ``Unread
since ...'' if they have new mail.
.Pp
.It Fl p
Prevents
the

View File

@ -34,6 +34,16 @@
* SUCH DAMAGE.
*/
/*
* Luke Mewburn <lm@rmit.edu.au> added the following on 940622:
* - mail status ("No Mail", "Mail read:...", or "New Mail ...,
* Unread since ...".)
* - 4 digit phone extensions (3210 is printed as x3210.)
* - host/office toggling in short format with -h & -o.
* - short day names (`Tue' printed instead of `Jun 21' if the
* login time is < 6 days.
*/
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1989, 1993\n\
@ -52,9 +62,10 @@ static char sccsid[] = "@(#)finger.c 8.2 (Berkeley) 9/30/93";
*
* There are currently two output formats; the short format is one line
* per user and displays login name, tty, login time, real name, idle time,
* and office location/phone number. The long format gives the same
* information (in a more legible format) as well as home directory, shell,
* mail info, and .plan/.project files.
* and either remote host information (default) or office location/phone
* number, depending on if -h or -o is used respectively.
* The long format gives the same information (in a more legible format) as
* well as home directory, shell, mail info, and .plan/.project files.
*/
#include <sys/param.h>
@ -71,7 +82,7 @@ static char sccsid[] = "@(#)finger.c 8.2 (Berkeley) 9/30/93";
DB *db;
time_t now;
int entries, lflag, mflag, pplan, sflag;
int entries, lflag, mflag, pplan, sflag, oflag;
char tbuf[1024];
static void loginlist __P((void));
@ -83,7 +94,10 @@ main(argc, argv)
{
int ch;
while ((ch = getopt(argc, argv, "lmps")) != EOF)
/* delete this for sun behavior */
oflag = 1; /* default to old behavior for now */
while ((ch = getopt(argc, argv, "lmpsho")) != EOF)
switch(ch) {
case 'l':
lflag = 1; /* long format */
@ -97,10 +111,16 @@ main(argc, argv)
case 's':
sflag = 1; /* short format */
break;
case 'h':
oflag = 0; /* remote host info */
break;
case 'o':
oflag = 1; /* office info */
break;
case '?':
default:
(void)fprintf(stderr,
"usage: finger [-lmps] [login ...]\n");
"usage: finger [-lmpsho] [login ...]\n");
exit(1);
}
argc -= optind;

View File

@ -45,6 +45,8 @@ typedef struct person {
char *officephone; /* pointer to office phone no. */
char *realname; /* pointer to full name */
char *shell; /* user's shell */
time_t mailread; /* last time mail was read */
time_t mailrecv; /* last time mail was received */
struct where *whead, *wtail; /* list of where user is or has been */
} PERSON;

View File

@ -113,6 +113,7 @@ lprint(pn)
* home directory
* shell
* office, office phone, home phone if available
* mail status
*/
(void)printf("Login: %-15s\t\t\tName: %s\nDirectory: %-25s",
pn->name, pn->realname, pn->dir);
@ -152,7 +153,8 @@ lprint(pn)
putchar('\n');
/*
* long format con't: * if logged in
* long format con't:
* if logged in
* terminal
* idle time
* if messages allowed
@ -221,6 +223,23 @@ lprint(pn)
}
putchar('\n');
}
if (pn->mailrecv == -1)
printf("No Mail.\n");
else if (pn->mailrecv > pn->mailread) {
tp = localtime(&pn->mailrecv);
t = asctime(tp);
tzn = tp->tm_zone;
printf("New mail received %.16s %.4s (%s)\n", t, t + 20, tzn);
tp = localtime(&pn->mailread);
t = asctime(tp);
tzn = tp->tm_zone;
printf(" Unread since %.16s %.4s (%s)\n", t, t + 20, tzn);
} else {
tp = localtime(&pn->mailread);
t = asctime(tp);
tzn = tp->tm_zone;
printf("Mail last read %.16s %.4s (%s)\n", t, t + 20, tzn);
}
}
static int

View File

@ -57,6 +57,7 @@ void
sflag_print()
{
extern time_t now;
extern int oflag;
register PERSON *pn;
register WHERE *w;
register int sflag, r;
@ -71,14 +72,19 @@ sflag_print()
* if terminal writeable (add an '*' to the terminal name
* if not)
* if logged in show idle time and day logged in, else
* show last login date and time. If > 6 moths,
* show year instead of time.
* office location
* office phone
* show last login date and time.
* If > 6 months, show year instead of time.
* if (-o)
* office location
* office phone
* else
* remote host
*/
#define MAXREALNAME 20
(void)printf("%-*s %-*s %s\n", UT_NAMESIZE, "Login", MAXREALNAME,
"Name", "Tty Idle Login Time Office Office Phone");
#define MAXHOSTNAME 20
(void)printf("%-*s %-*s %s %s\n", UT_NAMESIZE, "Login", MAXREALNAME,
"Name", "TTY Idle Login Time",
oflag ? " Office Office Phone" : " Where");
for (sflag = R_FIRST;; sflag = R_NEXT) {
r = (*db->seq)(db, &key, &data, sflag);
@ -110,18 +116,24 @@ sflag_print()
} else
(void)printf(" * ");
p = ctime(&w->loginat);
(void)printf("%.6s", p + 4);
if (now - w->loginat < SECSPERDAY * (DAYSPERWEEK - 1))
(void)printf("%.3s ", p);
else
(void)printf("%.6s", p + 4);
if (now - w->loginat >= SECSPERDAY * DAYSPERNYEAR / 2)
(void)printf(" %.4s", p + 20);
else
(void)printf(" %.5s", p + 11);
office: if (pn->office)
office: if (oflag) {
if (pn->office)
(void)printf(" %-10.10s", pn->office);
else if (pn->officephone)
(void)printf(" %-10.10s", " ");
if (pn->officephone)
(void)printf(" %-.15s",
prphone(pn->officephone));
} else
(void)printf(" %.*s", MAXHOSTNAME, w->host);
putchar('\n');
}
}

View File

@ -51,6 +51,7 @@ static char sccsid[] = "@(#)util.c 8.1 (Berkeley) 6/6/93";
#include <stdlib.h>
#include <string.h>
#include <paths.h>
#include <errno.h>
#include "finger.h"
static void find_idle_and_ttywrite __P((WHERE *));
@ -276,14 +277,17 @@ prphone(num)
*p++ = *num++;
break;
case 5: /* x0-1234 */
case 4: /* x1234 */
*p++ = 'x';
*p++ = *num++;
break;
default:
return(num);
}
*p++ = '-';
*p++ = *num++;
if (len != 4) {
*p++ = '-';
*p++ = *num++;
}
*p++ = *num++;
*p++ = *num++;
*p++ = *num++;
@ -317,6 +321,7 @@ userinfo(pn, pw)
{
register char *p, *t;
char *bp, name[1024];
struct stat sb;
pn->realname = pn->office = pn->officephone = pn->homephone = NULL;
@ -349,6 +354,18 @@ userinfo(pn, pw)
strdup(p) : NULL;
pn->homephone = ((p = strsep(&bp, ",")) && *p) ?
strdup(p) : NULL;
(void)sprintf(tbuf,"%s/%s", _PATH_MAILDIR, pw->pw_name);
pn->mailrecv = -1; /* -1 == not_valid */
if (stat(tbuf, &sb) < 0) {
if (errno != ENOENT) {
(void)fprintf(stderr,
"finger: %s: %s\n", tbuf, strerror(errno));
return;
}
} else if (sb.st_size != 0) {
pn->mailrecv = sb.st_mtime;
pn->mailread = sb.st_atime;
}
}
#if __STDC__