OSDN Git Service

[Refactor] #37353 player_type の 闘技場観戦モードフラグ名を inside_arena から phase_out に改名。 (効果としては...
[hengband/hengband.git] / src / inet.c
1 /* File: inet.c */
2
3 #include "angband.h"
4 #include "util.h"
5 #include "files.h"
6 #include "inet.h"
7
8
9 #ifdef WORLD_SCORE
10
11 #include <stdio.h>
12 #include <stdarg.h>
13 #include <ctype.h>
14
15 #if defined(WINDOWS)
16 #include <winsock.h>
17 #elif defined(MACINTOSH)
18 #include <OpenTransport.h>
19 #include <OpenTptInternet.h>
20 #else
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <netdb.h>
25 #include <sys/time.h>
26
27 #include <setjmp.h>
28 #include <signal.h>
29 #endif
30
31 #include <stdlib.h>
32
33 static concptr errstr;
34 static char     *proxy;
35 static int      proxy_port;
36
37 bool browsing_movie;
38
39 #ifdef MACINTOSH
40 static InetSvcRef inet_services = nil;
41 static EndpointRef ep           = kOTInvalidEndpointRef;
42 #endif
43
44 #if 0 /* とりあえず現在は使わない。by Habu*/
45 static char     *homeurl;
46
47 void
48 set_homeurl(char *s)
49 {
50         if(homeurl)
51                 free(homeurl);
52
53         homeurl = malloc(strlen(s) + 1);
54         strcpy(homeurl, s);
55 }
56
57 char *
58 get_homeurl()
59 {
60         if(homeurl)
61                 return homeurl;
62         else
63                 return "";
64 }
65
66
67 char *
68 get_proxy()
69 {
70         static char buf[BUFSIZ];
71
72         if(proxy && proxy[0]){
73 #ifndef WINDOWS
74                 snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
75 #else
76                 _snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
77 #endif
78                 buf[sizeof(buf)-1] = '\0';
79                 return buf;
80         }
81         else
82                 return "";
83 }
84
85 char *
86 get_proxy_host()
87 {
88         return proxy;
89 }
90
91 int
92 get_proxy_port()
93 {
94         return proxy_port;
95 }
96
97 int soc_read(int sd, char *buf, size_t sz)
98 {
99 #ifndef WINDOWS
100         return read(sd, buf, sz);
101 #else
102         return recv(sd, buf, sz, 0);
103 #endif
104 }
105
106 #endif /* if 0 */
107
108 /* プロキシサーバのアドレスををファイルから読んで設定する */
109 void set_proxy(char *default_url, int default_port)
110 {
111         char buf[1024];
112         size_t len;
113         FILE *fp;
114         char *s;
115
116 #ifdef MACINTOSH
117         int i;
118         char tmp[8];
119 #endif
120
121         path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, "proxy.prf");
122
123         /* ファイルから設定を読む。 */
124         fp = my_fopen(buf, "r");
125
126         if (!fp)
127         {
128                 /* ファイルが存在しない場合はデフォルトを設定 */
129                 proxy = default_url;
130                 proxy_port = default_port;
131                 return;
132         }
133
134         while (my_fgets(fp, buf, sizeof(buf))==0)
135         {
136                 if (buf[0] != '#' && buf[0] != '\0') break;
137         }
138
139         my_fclose(fp);
140
141         /* ポインタを用意。 */
142         s = buf;
143
144         /* "http://" から始まっている場合はその部分をカットする。 */
145 #if defined(WINDOWS)
146         if (!strnicmp(s, "http://", 7))
147         {
148                 s += 7;
149         }
150 #elif defined(MACINTOSH)
151         strncpy( tmp , s , 7 );
152         for ( i = 0 ; i < 7 ; i++ )
153         {
154                 if ( isalpha(tmp[i]) )
155                         tmp[i]= tolower(tmp[i]);
156         }
157         if (!strncmp(s, "http://", 7))
158         {
159                 s += 7;
160         }
161 #else
162         if (!strncasecmp(s, "http://", 7))
163         {
164                 s += 7;
165         }
166 #endif
167
168         /* 文字列の長さを調べ、必要なメモリを確保 */
169         len = strlen(s);
170         proxy = malloc(len + 1);
171
172         /* ポート番号があるかどうかを調べ、あればproxy_portに設定。 */
173         --len;
174         while (len > 0 && isdigit((unsigned char)s[len]))
175                 --len;
176         if (len > 0 && s[len] == ':' && s[len + 1] != '\0')
177         {
178                 s[len] = '\0';
179                 strcpy(proxy, s);
180                 proxy_port = atoi(s + (len + 1));
181         }
182         else
183         {
184                 strcpy(proxy, s);
185                 proxy_port = default_port;
186         }
187
188         /* プロキシのアドレスをproxyにコピー */
189         strcpy(proxy, s);
190
191         if (proxy_port == 0)
192                 proxy_port = 80;
193 }
194
195 /* ソケットにバッファの内容を書き込む */
196 int soc_write(int sd, char *buf, size_t sz)
197 {
198 #ifndef MACINTOSH
199         int nleft, nwritten;
200
201         nleft = sz;
202
203         while (nleft > 0) {
204                 nwritten = send(sd, buf, nleft, 0);
205                 if (nwritten <= 0)
206                         return (nwritten);
207                 nleft -= nwritten;
208                 buf += nwritten;
209         }
210 #else /* !MACINTOSH */
211
212         OTResult bytesSent;
213         
214         OTSnd(ep, (void *) buf, sz, 0);
215
216 #endif
217         return sz;
218 }
219
220 int soc_read(int sd, char *buf, size_t sz)
221 {
222 #ifndef MACINTOSH
223         int nleft, nread = 0;
224
225         nleft = sz;
226
227         while (nleft > 0) {
228                 int n;
229                 n = recv(sd, buf + nread, nleft, 0);
230                 if (n <= 0)
231                         return (nread);
232                 nleft -= n;
233                 nread += n;
234         }
235 #else /* !MACINTOSH */
236
237         OTResult bytesSent;
238
239         OTSnd(ep, (void *)buf, sz, 0);
240
241 #endif
242         return nread;
243 }
244
245 #if 0 /* おそらく使わない */
246 int soc_write_str(int sd, char *buf)
247 {
248         return soc_write(sd, buf, strlen(buf));
249 }
250 #endif
251
252 #if !defined(WINDOWS) && !defined(MACINTOSH)
253 static sigjmp_buf       env;
254 static void (*sig_int_saved)(int);
255 static void (*sig_alm_saved)(int);
256 #endif
257
258 static void restore_signal(void)
259 {
260 #if !defined(WINDOWS) && !defined(MACINTOSH)
261         struct itimerval        val0;
262
263         /* itimerリセット用 */
264         val0.it_interval.tv_sec = 0;
265         val0.it_interval.tv_usec = 0;
266         val0.it_value.tv_sec = 0;
267         val0.it_value.tv_usec = 0;
268
269         /* アラーム解除 */
270         setitimer(ITIMER_REAL, &val0, NULL);
271         signal(SIGALRM, sig_alm_saved);
272         signal(SIGINT, sig_int_saved);
273 #endif
274 }
275
276
277 #if !defined(WINDOWS) && !defined(MACINTOSH)
278 static void interrupt_report(int sig)
279 {
280         restore_signal();
281         siglongjmp(env, sig);
282 }
283 #endif
284
285
286 /* サーバにコネクトする関数。 */
287 int connect_server(int timeout, concptr host, int port)
288 #ifndef MACINTOSH
289 {
290         int                     sd;
291         struct sockaddr_in      to;
292         struct hostent  *hp;
293
294 #ifndef WINDOWS
295         struct itimerval        val;
296         int                     ret;
297
298         /* itimer設定用 */
299         val.it_interval.tv_sec = 0;
300         val.it_interval.tv_usec = 0;
301         val.it_value.tv_sec = timeout;
302         val.it_value.tv_usec = 0;
303
304         /* タイムアウト、もしくは中断した時の処理。 */
305         if ((ret = sigsetjmp(env,1)) != 0)
306         {
307 #ifdef JP
308                 if (ret == SIGALRM)
309                         errstr = "エラー: タイムアウト";
310                 else
311                         errstr = "エラー: インタラプト";
312 #else
313                 if (ret == SIGALRM)
314                         errstr = "Error : time out";
315                 else
316                         errstr = "Error : interupted";
317 #endif
318                 return -1;
319         }
320         sig_int_saved = signal(SIGINT, interrupt_report);
321         sig_alm_saved = signal(SIGALRM, interrupt_report);
322
323         /* タイムアウトの時間を設定 */
324         setitimer(ITIMER_REAL, &val, NULL);
325 #else
326         /* Unused in Windows */
327         (void)timeout;
328 #endif
329
330         /* プロキシが設定されていればプロキシに繋ぐ */
331         if (proxy && proxy[0])
332         {
333                 if ((hp = gethostbyname(proxy)) == NULL)
334                 {
335 #ifdef JP
336                         errstr = "エラー: プロキシのアドレスが不正です";
337 #else
338                         errstr = "Error : wrong proxy addres";
339 #endif
340
341                         restore_signal();
342
343                         return -1;
344                 }
345         }
346         else if ((hp = gethostbyname(host)) == NULL)
347         {
348 #ifdef JP
349                 errstr = "エラー: サーバのアドレスが不正です";
350 #else
351                 errstr = "Error : wrong server adress";
352 #endif
353
354                 restore_signal();
355
356                 return -1;
357         }
358
359         memset(&to, 0, sizeof(to));
360         memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
361
362         to.sin_family = AF_INET;
363
364         if(proxy && proxy[0] && proxy_port)
365                 to.sin_port = htons((unsigned short int)proxy_port);
366         else
367                 to.sin_port = htons((unsigned short int)port);
368
369 #ifndef WINDOWS
370         if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
371 #else
372         if  ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
373 #endif
374         {
375 #ifdef JP
376                 errstr = "エラー: ソケットを生成できません";
377 #else
378                 errstr = "Error : cannot create socket.";
379 #endif
380                 restore_signal();
381                 return -1;
382         }
383
384         if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0)
385         {
386 #ifdef JP
387                 errstr = "エラー: サーバに接続できません";
388 #else
389                 errstr = "Error : failed to connect server";
390 #endif
391                 restore_signal();
392 #ifndef WINDOWS
393                 close(sd);
394 #else
395                 closesocket(sd);
396 #endif
397                 return -1;
398         }
399
400         restore_signal();
401
402         return sd;
403 }
404
405 #else /* !MACINTOSH */
406
407         /* サーバにコネクトする関数。 Mac */
408 {
409         OSStatus err;
410         InetHostInfo    response;
411         InetHost                host_addr;
412         InetAddress     inAddr;
413         TCall                   sndCall;
414         Boolean                 bind    = false;
415         
416         memset(&response, 0, sizeof(response));
417         
418 #if TARGET_API_MAC_CARBON
419         inet_services = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, &err, NULL);
420 #else
421         inet_services = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err);
422 #endif 
423         
424         if (err == noErr) {
425                 
426                 if (proxy && proxy[0])
427                 {
428                         err = OTInetStringToAddress(inet_services, proxy, &response);
429                 }
430                 else
431                 {
432                         err = OTInetStringToAddress(inet_services, (char *)host, &response);
433                 }
434                 
435                 if (err == noErr)
436                 {
437                         host_addr = response.addrs[0];
438                 }
439                 else
440                 {
441                         errstr = "error: bad score server!\n";
442                 }
443                 
444 #if TARGET_API_MAC_CARBON
445                 ep = (void *)OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err, NULL);
446 #else
447                 ep = (void *)OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
448 #endif
449
450                 if (err == noErr)
451                 {
452                         err = OTBind(ep, nil, nil);
453                         bind = (err == noErr);
454                 }
455                 if (err == noErr)
456                 {
457                         if (proxy && proxy[0] && proxy_port)
458                                 OTInitInetAddress(&inAddr, proxy_port, host_addr);
459                         else
460                                 OTInitInetAddress(&inAddr, port, host_addr);
461                         
462                         sndCall.addr.len        = sizeof(InetAddress);                          
463                         sndCall.addr.buf        = (unsigned char*) &inAddr;
464                         sndCall.opt.buf         = nil;        /* no connection options */
465                         sndCall.opt.len         = 0;
466                         sndCall.udata.buf       = nil;        /* no connection data */
467                         sndCall.udata.len       = 0;
468                         sndCall.sequence        = 0;          /* ignored by OTConnect */
469                         
470                         err = OTConnect(ep, &sndCall, NULL);
471                         
472                         if (err != noErr)
473                         {
474                                 errstr = "error: cannot connect score server!\n";
475                         }
476                 }
477         }
478         
479         if ( err != noErr )
480         {
481                 if ( bind )
482                 {
483                         OTUnbind(ep);
484                 }
485                 /* Clean up. */
486                 if (ep != kOTInvalidEndpointRef)
487                 {
488                         OTCloseProvider(ep);
489                         ep = nil;
490                 }
491                 if (inet_services != nil)
492                 {
493                         OTCloseProvider(inet_services);
494                         inet_services = nil;
495                 }
496         
497                 return -1;
498         }
499         
500         return 1;
501 }
502 #endif
503
504
505 int disconnect_server(int sd)
506 {
507 #if defined(WINDOWS)
508         return closesocket(sd);
509 #elif defined(MACINTOSH)
510         if (ep != kOTInvalidEndpointRef)
511         {
512                 OTCloseProvider(ep);
513         }
514         
515         if (inet_services != nil)
516         {
517                 OTCloseProvider(inet_services);
518         }
519 #else
520         return close(sd);
521 #endif
522 }
523
524 concptr soc_err()
525 {
526         return errstr;
527 }
528
529 #endif /* WORLD_SCORE */