1 /* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. 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, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * 8/2/97 - Ted Felix <tfelix@fred.net> 37 * Ported to Win32 from 4.4BSD-LITE2 at wcarchive. 38 * NT Workstation already has finger, and it runs fine under 39 * Win95. Thought I'd do this anyways since not everyone has 40 * access to NT. 41 * Had to remove local handling. Otherwise, same as whois. 42 */ 43 44 /* 45 * Finger prints out information about users. It is not portable since 46 * certain fields (e.g. the full user name, office, and phone numbers) are 47 * extracted from the gecos field of the passwd file which other UNIXes 48 * may not have or may use for other things. 49 * 50 * There are currently two output formats; the short format is one line 51 * per user and displays login name, tty, login time, real name, idle time, 52 * and office location/phone number. The long format gives the same 53 * information (in a more legible format) as well as home directory, shell, 54 * mail info, and .plan/.project files. 55 */ 56 57 #include "precomp.h" 58 59 #include <time.h> 60 61 #include "getopt.h" 62 63 char *__progname; 64 65 time_t now; 66 int lflag, mflag, pplan, sflag; 67 68 static void userlist(int, char **); 69 void usage(); 70 71 int 72 main(int argc, char **argv) 73 { 74 int ch; 75 76 while ((ch = getopt(argc, argv, "lmps")) != EOF) 77 switch(ch) { 78 case 'l': 79 lflag = 1; /* long format */ 80 break; 81 case 'm': 82 mflag = 1; /* force exact match of names */ 83 break; 84 case 'p': 85 pplan = 1; /* don't show .plan/.project */ 86 break; 87 case 's': 88 sflag = 1; /* short format */ 89 break; 90 case '?': 91 default: 92 (void)fprintf(stderr, 93 "usage: finger [-lmps] login [...]\n"); 94 exit(1); 95 } 96 argc -= optind; 97 argv += optind; 98 99 (void)time(&now); 100 if (!*argv) { 101 usage(); 102 } else { 103 userlist(argc, argv); 104 /* 105 * Assign explicit "large" format if names given and -s not 106 * explicitly stated. Force the -l AFTER we get names so any 107 * remote finger attempts specified won't be mishandled. 108 */ 109 if (!sflag) 110 lflag = 1; /* if -s not explicit, force -l */ 111 } 112 return 0; 113 } 114 115 116 static void 117 userlist(int argc, char **argv) 118 { 119 int *used = NULL; 120 char **ap, **nargv, **np, **p; 121 WORD wVersionRequested; 122 WSADATA wsaData; 123 int iErr; 124 125 126 if ((nargv = (char**) malloc((argc+1) * sizeof(char *))) == NULL || 127 (used = (int*) calloc(argc, sizeof(int))) == NULL) 128 err(1, NULL); 129 130 /* Pull out all network requests into nargv. */ 131 for (ap = p = argv, np = nargv; *p; ++p) 132 if (index(*p, '@')) 133 *np++ = *p; 134 else 135 *ap++ = *p; 136 137 *np++ = NULL; 138 *ap++ = NULL; 139 140 /* If there are local requests */ 141 if (*argv) 142 { 143 fprintf(stderr, "Warning: Can't do local finger\n"); 144 } 145 146 /* Start winsock */ 147 wVersionRequested = MAKEWORD( 1, 1 ); 148 iErr = WSAStartup( wVersionRequested, &wsaData ); 149 if ( iErr != 0 ) 150 { 151 /* Tell the user that we couldn't find a usable */ 152 /* WinSock DLL. */ 153 fprintf(stderr, "WSAStartup failed\n"); 154 free(nargv); 155 free(used); 156 return; 157 } 158 159 /* Handle network requests. */ 160 for (p = nargv; *p;) 161 netfinger(*p++); 162 163 /* Bring down winsock */ 164 WSACleanup(); 165 free(nargv); 166 free(used); 167 exit(0); 168 } 169 170 void usage() 171 { 172 (void)fprintf(stderr, 173 "usage: finger [-lmps] login [...]\n"); 174 exit(1); 175 } 176 177