Merge 14981:15268 from trunk
[reactos.git] / reactos / apps / utils / net / finger / finger.c
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 <winsock2.h>
58 #include "err.h"
59 #include <errno.h>
60 #include <fcntl.h>
61 #include <stdio.h>
62 #include <stdlib.h>
63 #include <string.h>
64 #include <time.h>
65 #include "unistd.h"
66
67 #include "various.h"
68 #include "getopt.h"
69
70 char *__progname;
71
72 time_t now;
73 int lflag, mflag, pplan, sflag;
74
75 static void userlist(int, char **);
76 void usage();
77 void netfinger(char *);
78
79 int
80 main(int argc, char **argv)
81 {
82 int ch;
83
84 while ((ch = getopt(argc, argv, "lmps")) != EOF)
85 switch(ch) {
86 case 'l':
87 lflag = 1; /* long format */
88 break;
89 case 'm':
90 mflag = 1; /* force exact match of names */
91 break;
92 case 'p':
93 pplan = 1; /* don't show .plan/.project */
94 break;
95 case 's':
96 sflag = 1; /* short format */
97 break;
98 case '?':
99 default:
100 (void)fprintf(stderr,
101 "usage: finger [-lmps] login [...]\n");
102 exit(1);
103 }
104 argc -= optind;
105 argv += optind;
106
107 (void)time(&now);
108 if (!*argv) {
109 usage();
110 } else {
111 userlist(argc, argv);
112 /*
113 * Assign explicit "large" format if names given and -s not
114 * explicitly stated. Force the -l AFTER we get names so any
115 * remote finger attempts specified won't be mishandled.
116 */
117 if (!sflag)
118 lflag = 1; /* if -s not explicit, force -l */
119 }
120 return 0;
121 }
122
123
124 static void
125 userlist(int argc, char **argv)
126 {
127 int *used;
128 char **ap, **nargv, **np, **p;
129 WORD wVersionRequested;
130 WSADATA wsaData;
131 int iErr;
132
133
134 if ((nargv = malloc((argc+1) * sizeof(char *))) == NULL ||
135 (used = calloc(argc, sizeof(int))) == NULL)
136 err(1, NULL);
137
138 /* Pull out all network requests into nargv. */
139 for (ap = p = argv, np = nargv; *p; ++p)
140 if (index(*p, '@'))
141 *np++ = *p;
142 else
143 *ap++ = *p;
144
145 *np++ = NULL;
146 *ap++ = NULL;
147
148 /* If there are local requests */
149 if (*argv)
150 {
151 fprintf(stderr, "Warning: Can't do local finger\n");
152 }
153
154 /* Start winsock */
155 wVersionRequested = MAKEWORD( 1, 1 );
156 iErr = WSAStartup( wVersionRequested, &wsaData );
157 if ( iErr != 0 )
158 {
159 /* Tell the user that we couldn't find a usable */
160 /* WinSock DLL. */
161 fprintf(stderr, "WSAStartup failed\n");
162 return;
163 }
164
165 /* Handle network requests. */
166 for (p = nargv; *p;)
167 netfinger(*p++);
168
169 /* Bring down winsock */
170 WSACleanup();
171 exit(0);
172 }
173
174 void usage()
175 {
176 (void)fprintf(stderr,
177 "usage: finger [-lmps] login [...]\n");
178 exit(1);
179 }
180