ReactOS 0.4.15-dev-8235-gcd88a97
whois.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * 8/1/97 - Ted Felix <tfelix@fred.net>
34 * Ported to Win32 from 4.4-BSDLITE2 from wcarchive.
35 * Added WSAStartup()/WSACleanup() and switched from the
36 * more convenient fdopen()/fprintf() to send()/recv().
37 */
38
39//#include <sys/types.h>
40#define WIN32_NO_STATUS
41#include <windef.h>
42#define _INC_WINDOWS
43#include <winsock2.h>
44/* #include <sys/socket.h> */
45/* #include <netinet/in.h> */
46/* #include <netdb.h> */
47#include <stdio.h>
48#include <stdlib.h>
49
50/* #include <various.h> */
51/* #include <getopt.h> */
52/* #include <io.h> */
53
54static char NICHOST[] = "whois.internic.net";
55char *host = NULL;
56int optset = 0;
57static void usage();
58static void cleanup(int iExitCode);
59
60void getwhoisserver(int argc, char **argv)
61{
62 int i = 1;
63
64 while(i < argc)
65 {
66 if (!strcmp(argv[i], "-h"))
67 {
68 if (i + 2 < argc)
69 {
70 host = argv[i +1];
71 optset = i + 1;
72 }
73 else
74 {
75 optset = argc;
76 }
77 return;
78 }
79 i++;
80 }
81 host = NICHOST;
82 optset = 1;
83}
84
85int main(int argc, char **argv)
86{
87 char ch;
88 struct sockaddr_in sin;
89 struct hostent *hp;
90 struct servent *sp;
91 SOCKET s;
92
93 WORD wVersionRequested;
94 WSADATA wsaData;
95 int err;
96
98 argc -= optset;
99 argv += optset;
100
101 if (!host || !argc)
102 usage();
103
104 /* Start winsock */
105 wVersionRequested = MAKEWORD( 1, 1 );
106 err = WSAStartup( wVersionRequested, &wsaData );
107 if ( err != 0 )
108 {
109 /* Tell the user that we couldn't find a usable */
110 /* WinSock DLL. */
111 perror("whois: WSAStartup failed");
112 cleanup(1);
113 }
114
115 hp = gethostbyname(host);
116 if (hp == NULL) {
117 (void)fprintf(stderr, "whois: %s: ", host);
118 cleanup(1);
119 }
120 host = hp->h_name;
121
122 s = socket(hp->h_addrtype, SOCK_STREAM, 0);
123 if (s == INVALID_SOCKET) {
124 perror("whois: socket");
125 cleanup(1);
126 }
127
128 memset(/*(caddr_t)*/&sin, 0, sizeof(sin));
129 sin.sin_family = hp->h_addrtype;
130 if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
131 perror("whois: bind");
132 cleanup(1);
133 }
134
135 memcpy((char *)&sin.sin_addr, hp->h_addr, hp->h_length);
136 sp = getservbyname("nicname", "tcp");
137 if (sp == NULL) {
138 (void)fprintf(stderr, "whois: nicname/tcp: unknown service\n");
139 cleanup(1);
140 }
141
142 sin.sin_port = sp->s_port;
143
144 /* have network connection; identify the host connected with */
145 (void)printf("[%s]\n", hp->h_name);
146
147 if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
148 fprintf(stderr, "whois: connect error = %d\n", WSAGetLastError());
149 cleanup(1);
150 }
151
152 /* WinSock doesn't allow using a socket as a file descriptor. */
153 /* Have to use send() and recv(). whois will drop connection. */
154
155 /* For each request */
156 while (argc-- > 1)
157 {
158 /* Send the request */
159 send(s, *argv, strlen(*argv), 0);
160 send(s, " ", 1, 0);
161 argv++;
162 }
163 /* Send the last request */
164 send(s, *argv, strlen(*argv), 0);
165 send(s, "\r\n", 2, 0);
166
167 /* Receive anything and print it */
168 while (recv(s, &ch, 1, 0) == 1)
169 putchar(ch);
170
171 cleanup(0);
172 return 0;
173}
174
175static void usage()
176{
177 (void)fprintf(stderr, "usage: whois [-h hostname] name ...\n");
178 cleanup(1);
179}
180
181static void cleanup(int iExitCode)
182{
183 WSACleanup();
184 exit(iExitCode);
185}
static int argc
Definition: ServiceArgs.c:12
_STLP_DECLSPEC complex< float > _STLP_CALL sin(const complex< float > &)
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
int putchar(int c)
Definition: crtsupp.c:12
#define NULL
Definition: types.h:112
static void cleanup(void)
Definition: main.c:1335
INT WSAAPI recv(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags)
Definition: recv.c:23
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
Definition: send.c:23
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
int main()
Definition: test.c:6
#define SOCK_STREAM
Definition: tcpip.h:118
unsigned short WORD
Definition: ntddk_ex.h:93
#define printf
Definition: freeldr.h:97
PHOSTENT WSAAPI gethostbyname(IN const char FAR *name)
Definition: getxbyxx.c:221
PSERVENT WSAAPI getservbyname(IN const char FAR *name, IN const char FAR *proto)
Definition: getxbyxx.c:500
GLdouble s
Definition: gl.h:2039
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_CRTIMP void __cdecl perror(_In_opt_z_ const char *_ErrMsg)
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static const WCHAR sp[]
Definition: suminfo.c:287
#define argv
Definition: mplay32.c:18
#define err(...)
#define exit(n)
Definition: config.h:202
#define memset(x, y, z)
Definition: compat.h:39
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
Definition: socklife.c:36
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
char * h_name
Definition: winsock.h:134
short h_length
Definition: winsock.h:137
short h_addrtype
Definition: winsock.h:136
#define MAKEWORD(a, b)
Definition: typedefs.h:248
char * host
Definition: whois.c:55
static void usage()
Definition: whois.c:175
int optset
Definition: whois.c:56
void getwhoisserver(int argc, char **argv)
Definition: whois.c:60
static char NICHOST[]
Definition: whois.c:54
int PASCAL FAR WSAGetLastError(void)
Definition: dllmain.c:112
int PASCAL FAR WSACleanup(void)
Definition: startup.c:60
#define INVALID_SOCKET
Definition: winsock.h:332
UINT_PTR SOCKET
Definition: winsock.h:47