17 #elif defined(MACINTOSH)
18 #include <OpenTransport.h>
19 #include <OpenTptInternet.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
33 static concptr errstr;
35 static int proxy_port;
38 static InetSvcRef inet_services = nil;
39 static EndpointRef ep = kOTInvalidEndpointRef;
42 #if 0 /* とりあえず現在は使わない。by Habu*/
51 homeurl = malloc(strlen(s) + 1);
68 static char buf[BUFSIZ];
70 if(proxy && proxy[0]){
72 snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
74 _snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
76 buf[sizeof(buf)-1] = '\0';
95 int soc_read(int sd, char *buf, size_t sz)
98 return read(sd, buf, sz);
100 return recv(sd, buf, sz, 0);
106 /* プロキシサーバのアドレスををファイルから読んで設定する */
107 void set_proxy(char *default_url, int default_port)
119 path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, "proxy.prf");
122 fp = my_fopen(buf, "r");
126 /* ファイルが存在しない場合はデフォルトを設定 */
128 proxy_port = default_port;
132 while (my_fgets(fp, buf, sizeof(buf))==0)
134 if (buf[0] != '#' && buf[0] != '\0') break;
142 /* "http://" から始まっている場合はその部分をカットする。 */
144 if (!strnicmp(s, "http://", 7))
148 #elif defined(MACINTOSH)
149 strncpy( tmp , s , 7 );
150 for ( i = 0 ; i < 7 ; i++ )
152 if ( isalpha(tmp[i]) )
153 tmp[i]= tolower(tmp[i]);
155 if (!strncmp(s, "http://", 7))
160 if (!strncasecmp(s, "http://", 7))
166 /* 文字列の長さを調べ、必要なメモリを確保 */
168 proxy = malloc(len + 1);
170 /* ポート番号があるかどうかを調べ、あればproxy_portに設定。 */
172 while (len > 0 && isdigit((unsigned char)s[len]))
174 if (len > 0 && s[len] == ':' && s[len + 1] != '\0')
178 proxy_port = atoi(s + (len + 1));
183 proxy_port = default_port;
186 /* プロキシのアドレスをproxyにコピー */
193 /* ソケットにバッファの内容を書き込む */
194 int soc_write(int sd, char *buf, size_t sz)
202 nwritten = send(sd, buf, nleft, 0);
208 #else /* !MACINTOSH */
212 OTSnd(ep, (void *) buf, sz, 0);
218 int soc_read(int sd, char *buf, size_t sz)
221 int nleft, nread = 0;
227 n = recv(sd, buf + nread, nleft, 0);
233 #else /* !MACINTOSH */
237 OTSnd(ep, (void *)buf, sz, 0);
244 int soc_write_str(int sd, char *buf)
246 return soc_write(sd, buf, strlen(buf));
250 #if !defined(WINDOWS) && !defined(MACINTOSH)
251 static sigjmp_buf env;
252 static void (*sig_int_saved)(int);
253 static void (*sig_alm_saved)(int);
256 static void restore_signal(void)
258 #if !defined(WINDOWS) && !defined(MACINTOSH)
259 struct itimerval val0;
262 val0.it_interval.tv_sec = 0;
263 val0.it_interval.tv_usec = 0;
264 val0.it_value.tv_sec = 0;
265 val0.it_value.tv_usec = 0;
268 setitimer(ITIMER_REAL, &val0, NULL);
269 signal(SIGALRM, sig_alm_saved);
270 signal(SIGINT, sig_int_saved);
275 #if !defined(WINDOWS) && !defined(MACINTOSH)
276 static void interrupt_report(int sig)
279 siglongjmp(env, sig);
285 int connect_server(int timeout, concptr host, int port)
289 struct sockaddr_in to;
293 struct itimerval val;
297 val.it_interval.tv_sec = 0;
298 val.it_interval.tv_usec = 0;
299 val.it_value.tv_sec = timeout;
300 val.it_value.tv_usec = 0;
302 /* タイムアウト、もしくは中断した時の処理。 */
303 if ((ret = sigsetjmp(env,1)) != 0)
307 errstr = "エラー: タイムアウト";
309 errstr = "エラー: インタラプト";
312 errstr = "Error : time out";
314 errstr = "Error : interupted";
318 sig_int_saved = signal(SIGINT, interrupt_report);
319 sig_alm_saved = signal(SIGALRM, interrupt_report);
322 setitimer(ITIMER_REAL, &val, NULL);
324 /* Unused in Windows */
328 /* プロキシが設定されていればプロキシに繋ぐ */
329 if (proxy && proxy[0])
331 if ((hp = gethostbyname(proxy)) == NULL)
334 errstr = "エラー: プロキシのアドレスが不正です";
336 errstr = "Error : wrong proxy addres";
344 else if ((hp = gethostbyname(host)) == NULL)
347 errstr = "エラー: サーバのアドレスが不正です";
349 errstr = "Error : wrong server adress";
357 memset(&to, 0, sizeof(to));
358 memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
360 to.sin_family = AF_INET;
362 if(proxy && proxy[0] && proxy_port)
363 to.sin_port = htons((unsigned short int)proxy_port);
365 to.sin_port = htons((unsigned short int)port);
368 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
370 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
374 errstr = "エラー: ソケットを生成できません";
376 errstr = "Error : cannot create socket.";
382 if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0)
385 errstr = "エラー: サーバに接続できません";
387 errstr = "Error : failed to connect server";
403 #else /* !MACINTOSH */
405 /* サーバにコネクトする関数。 Mac */
408 InetHostInfo response;
412 Boolean bind = false;
414 memset(&response, 0, sizeof(response));
416 #if TARGET_API_MAC_CARBON
417 inet_services = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, &err, NULL);
419 inet_services = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err);
424 if (proxy && proxy[0])
426 err = OTInetStringToAddress(inet_services, proxy, &response);
430 err = OTInetStringToAddress(inet_services, (char *)host, &response);
435 host_addr = response.addrs[0];
439 errstr = "error: bad score server!\n";
442 #if TARGET_API_MAC_CARBON
443 ep = (void *)OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err, NULL);
445 ep = (void *)OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
450 err = OTBind(ep, nil, nil);
451 bind = (err == noErr);
455 if (proxy && proxy[0] && proxy_port)
456 OTInitInetAddress(&inAddr, proxy_port, host_addr);
458 OTInitInetAddress(&inAddr, port, host_addr);
460 sndCall.addr.len = sizeof(InetAddress);
461 sndCall.addr.buf = (unsigned char*) &inAddr;
462 sndCall.opt.buf = nil; /* no connection options */
464 sndCall.udata.buf = nil; /* no connection data */
465 sndCall.udata.len = 0;
466 sndCall.sequence = 0; /* ignored by OTConnect */
468 err = OTConnect(ep, &sndCall, NULL);
472 errstr = "error: cannot connect score server!\n";
484 if (ep != kOTInvalidEndpointRef)
489 if (inet_services != nil)
491 OTCloseProvider(inet_services);
503 int disconnect_server(int sd)
506 return closesocket(sd);
507 #elif defined(MACINTOSH)
508 if (ep != kOTInvalidEndpointRef)
513 if (inet_services != nil)
515 OTCloseProvider(inet_services);
527 #endif /* WORLD_SCORE */