|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Tony Nardo of the Johns Hopkins University/Applied Physics Lab. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)sprint.c 5.7 (Berkeley) 6/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include <sys/types.h> ! 28: #include <sys/time.h> ! 29: #include <tzfile.h> ! 30: #include <stdio.h> ! 31: #include "finger.h" ! 32: ! 33: extern int entries; ! 34: ! 35: sflag_print() ! 36: { ! 37: extern time_t now; ! 38: register PERSON *pn; ! 39: register WHERE *w; ! 40: register int cnt; ! 41: register char *p; ! 42: PERSON **list, **sort(); ! 43: time_t time(); ! 44: char *ctime(), *prphone(); ! 45: ! 46: list = sort(); ! 47: /* ! 48: * short format -- ! 49: * login name ! 50: * real name ! 51: * terminal name (the XX of ttyXX) ! 52: * if terminal writeable (add an '*' to the terminal name ! 53: * if not) ! 54: * if logged in show idle time and day logged in, else ! 55: * show last login date and time. If > 6 moths, ! 56: * show year instead of time. ! 57: * office location ! 58: * office phone ! 59: */ ! 60: #define MAXREALNAME 20 ! 61: (void)printf("%-*s %-*s %s\n", UT_NAMESIZE, "Login", MAXREALNAME, ! 62: "Name", "Tty Idle Login Office Office Phone"); ! 63: for (cnt = 0; cnt < entries; ++cnt) { ! 64: pn = list[cnt]; ! 65: for (w = pn->whead; w != NULL; w = w->next) { ! 66: (void)printf("%-*.*s %-*.*s ", UT_NAMESIZE, UT_NAMESIZE, ! 67: pn->name, MAXREALNAME, MAXREALNAME, ! 68: pn->realname ? pn->realname : ""); ! 69: if (!w->loginat) { ! 70: (void)printf(" * * No logins "); ! 71: goto office; ! 72: } ! 73: (void)putchar(w->info == LOGGEDIN && !w->writable ? ! 74: '*' : ' '); ! 75: if (*w->tty) ! 76: (void)printf("%-2.2s ", ! 77: w->tty[0] != 't' || w->tty[1] != 't' || ! 78: w->tty[2] != 'y' ? w->tty : w->tty + 3); ! 79: else ! 80: (void)printf(" "); ! 81: if (w->info == LOGGEDIN) { ! 82: stimeprint(w); ! 83: (void)printf(" "); ! 84: } else ! 85: (void)printf(" * "); ! 86: p = ctime(&w->loginat); ! 87: (void)printf("%.6s", p + 4); ! 88: if (now - w->loginat >= SECSPERDAY * DAYSPERNYEAR / 2) ! 89: (void)printf(" %.4s", p + 20); ! 90: else ! 91: (void)printf(" %.5s", p + 11); ! 92: office: if (pn->office) ! 93: (void)printf(" %-10.10s", pn->office); ! 94: else if (pn->officephone) ! 95: (void)printf(" %-10.10s", " "); ! 96: if (pn->officephone) ! 97: (void)printf(" %-.15s", ! 98: prphone(pn->officephone)); ! 99: putchar('\n'); ! 100: } ! 101: } ! 102: } ! 103: ! 104: PERSON ** ! 105: sort() ! 106: { ! 107: register PERSON *pn, **lp; ! 108: PERSON **list; ! 109: int psort(); ! 110: char *malloc(); ! 111: ! 112: if (!(list = (PERSON **)malloc((u_int)(entries * sizeof(PERSON *))))) { ! 113: (void)fprintf(stderr, "finger: out of space.\n"); ! 114: exit(1); ! 115: } ! 116: for (lp = list, pn = phead; pn != NULL; pn = pn->next) ! 117: *lp++ = pn; ! 118: (void)qsort(list, entries, sizeof(PERSON *), psort); ! 119: return(list); ! 120: } ! 121: ! 122: psort(p, t) ! 123: PERSON **p, **t; ! 124: { ! 125: return(strcmp((*p)->name, (*t)->name)); ! 126: } ! 127: ! 128: stimeprint(w) ! 129: WHERE *w; ! 130: { ! 131: register struct tm *delta; ! 132: ! 133: delta = gmtime(&w->idletime); ! 134: if (!delta->tm_yday) ! 135: if (!delta->tm_hour) ! 136: if (!delta->tm_min) ! 137: (void)printf(" "); ! 138: else ! 139: (void)printf("%5d", delta->tm_min); ! 140: else ! 141: (void)printf("%2d:%02d", ! 142: delta->tm_hour, delta->tm_min); ! 143: else ! 144: (void)printf("%4dd", delta->tm_yday); ! 145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.