ReactOS 0.4.16-dev-88-ga65b6ae
finger.c
Go to the documentation of this file.
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
64
67
68static void userlist(int, char **);
69void usage();
70
71int
72main(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:
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 {
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
116static void
117userlist(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
170void usage()
171{
173 "usage: finger [-lmps] login [...]\n");
174 exit(1);
175}
176
static int argc
Definition: ServiceArgs.c:12
static int used
Definition: adh-main.c:39
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition: getopt.c:55
int optind
Definition: getopt.c:47
void netfinger(char *name)
Definition: net.c:40
#define index(s, c)
Definition: various.h:29
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
int main()
Definition: test.c:6
__kernel_time_t time_t
Definition: linux.h:252
unsigned short WORD
Definition: ntddk_ex.h:93
int pplan
Definition: finger.c:66
void usage()
Definition: finger.c:170
time_t now
Definition: finger.c:65
int lflag
Definition: finger.c:66
int mflag
Definition: finger.c:66
int sflag
Definition: finger.c:66
char * __progname
Definition: finger.c:63
static void userlist(int, char **)
Definition: finger.c:117
GLfloat GLfloat p
Definition: glext.h:8902
#define EOF
Definition: stdio.h:24
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
__u16 time
Definition: mkdosfs.c:8
#define argv
Definition: mplay32.c:18
#define err(...)
#define calloc
Definition: rosglue.h:14
#define exit(n)
Definition: config.h:202
#define MAKEWORD(a, b)
Definition: typedefs.h:248
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36
int PASCAL FAR WSACleanup(void)
Definition: startup.c:60