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