]> git.pond.sub.org Git - empserver/blob - src/client/host.c
Import of Empire 4.2.12
[empserver] / src / client / host.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                           Ken Stevens, Steve McClure
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *  ---
21  *
22  *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
23  *  related information and legal notices. It is expected that any future
24  *  projects/authors will amend these files as needed.
25  *
26  *  ---
27  *
28  *  host.c: make stream connection to empire
29  * 
30  *  Known contributors to this file:
31  *     Dave Pare, 1989
32  *     Steve McClure, 1998
33  */
34
35 #include <stdio.h>
36 #include <sys/types.h>
37 #ifndef _WIN32
38 #include <sys/socket.h>
39 #include <netinet/in.h>
40 #include <netdb.h>
41 #include <unistd.h>
42 #else
43 #include <winsock.h>
44 #endif
45 #include <ctype.h>
46 #include "misc.h"
47
48 int
49 hostaddr(name, addr)
50         s_char  *name;
51         struct  sockaddr_in *addr;
52 {
53 #ifndef _WIN32
54         extern  u_long inet_addr();
55 #endif
56         struct  hostent *hp;
57
58         if (name == 0 || *name == 0)
59                 return 0;
60         if (isdigit(*name)) {
61                 addr->sin_addr.s_addr = inet_addr(name);
62         } else {
63                 hp = gethostbyname(name);
64                 if (hp == NULL) {
65                         fprintf(stderr, "%s: No such host\n", name);
66                         return 0;
67                 }
68                 bcopy(hp->h_addr, (s_char *)&addr->sin_addr,
69                         sizeof(addr->sin_addr));
70 #ifdef _WIN32
71                 printf("Trying to connect to '%s'\n", inet_ntoa(addr->sin_addr));
72                 fflush(stdout);
73 #endif
74         }
75         return 1;
76 }
77
78 int
79 hostport(name, addr)
80         s_char  *name;
81         struct  sockaddr_in *addr;
82 {
83         struct  servent *sp;
84 #ifndef _WIN32
85         int atoi();
86 #endif
87
88         if (name == 0 || *name == 0)
89                 return 0;
90         if (isdigit(*name)) {
91 #ifndef _WIN32
92                 addr->sin_port = htons(atoi(name));
93 #else
94                 addr->sin_port = atoi(name);
95                 addr->sin_port = htons(addr->sin_port);
96 #endif
97         } else {
98                 sp = getservbyname(name, "tcp");
99                 if (sp == NULL)
100                         return 0;
101                 addr->sin_port = sp->s_port;
102         }
103         return 1;
104 }
105
106 int
107 hostconnect(addr)
108         struct  sockaddr_in *addr;
109 {
110         int     s;
111
112         s = socket(AF_INET, SOCK_STREAM, 0);
113         if (s < 0) {
114 #ifdef _WIN32
115                 errno = WSAGetLastError();
116 #endif
117                 perror("socket");
118                 return -1;
119         }
120         addr->sin_family = AF_INET;
121         if (connect(s, (struct sockaddr *)addr, sizeof(*addr)) < 0) {
122 #ifdef _WIN32
123                 errno = WSAGetLastError();
124 #endif
125                 perror("connect");
126 #ifdef _WIN32
127                 printf("Check that your EMPIREHOST and EMPIREPORT are correct.\n");
128 #endif
129                 (void) close(s);
130                 return -1;
131         }
132         return s;
133 }