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;
40 static InetSvcRef inet_services = nil;
41 static EndpointRef ep = kOTInvalidEndpointRef;
44 #if 0 /* とりあえず現在は使わない。by Habu*/
53 homeurl = malloc(strlen(s) + 1);
70 static char buf[BUFSIZ];
72 if(proxy && proxy[0]){
74 snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
76 _snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
78 buf[sizeof(buf)-1] = '\0';
97 int soc_read(int sd, char *buf, size_t sz)
100 return read(sd, buf, sz);
102 return recv(sd, buf, sz, 0);
108 /* プロキシサーバのアドレスををファイルから読んで設定する */
109 void set_proxy(char *default_url, int default_port)
121 path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, "proxy.prf");
124 fp = my_fopen(buf, "r");
128 /* ファイルが存在しない場合はデフォルトを設定 */
130 proxy_port = default_port;
134 while (my_fgets(fp, buf, sizeof(buf))==0)
136 if (buf[0] != '#' && buf[0] != '\0') break;
144 /* "http://" から始まっている場合はその部分をカットする。 */
146 if (!strnicmp(s, "http://", 7))
150 #elif defined(MACINTOSH)
151 strncpy( tmp , s , 7 );
152 for ( i = 0 ; i < 7 ; i++ )
154 if ( isalpha(tmp[i]) )
155 tmp[i]= tolower(tmp[i]);
157 if (!strncmp(s, "http://", 7))
162 if (!strncasecmp(s, "http://", 7))
168 /* 文字列の長さを調べ、必要なメモリを確保 */
170 proxy = malloc(len + 1);
172 /* ポート番号があるかどうかを調べ、あればproxy_portに設定。 */
174 while (len > 0 && isdigit((unsigned char)s[len]))
176 if (len > 0 && s[len] == ':' && s[len + 1] != '\0')
180 proxy_port = atoi(s + (len + 1));
185 proxy_port = default_port;
188 /* プロキシのアドレスをproxyにコピー */
195 /* ソケットにバッファの内容を書き込む */
196 int soc_write(int sd, char *buf, size_t sz)
204 nwritten = send(sd, buf, nleft, 0);
210 #else /* !MACINTOSH */
214 OTSnd(ep, (void *) buf, sz, 0);
220 int soc_read(int sd, char *buf, size_t sz)
223 int nleft, nread = 0;
229 n = recv(sd, buf + nread, nleft, 0);
235 #else /* !MACINTOSH */
239 OTSnd(ep, (void *)buf, sz, 0);
246 int soc_write_str(int sd, char *buf)
248 return soc_write(sd, buf, strlen(buf));
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);
258 static void restore_signal(void)
260 #if !defined(WINDOWS) && !defined(MACINTOSH)
261 struct itimerval val0;
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;
270 setitimer(ITIMER_REAL, &val0, NULL);
271 signal(SIGALRM, sig_alm_saved);
272 signal(SIGINT, sig_int_saved);
277 #if !defined(WINDOWS) && !defined(MACINTOSH)
278 static void interrupt_report(int sig)
281 siglongjmp(env, sig);
287 int connect_server(int timeout, concptr host, int port)
291 struct sockaddr_in to;
295 struct itimerval val;
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;
304 /* タイムアウト、もしくは中断した時の処理。 */
305 if ((ret = sigsetjmp(env,1)) != 0)
309 errstr = "エラー: タイムアウト";
311 errstr = "エラー: インタラプト";
314 errstr = "Error : time out";
316 errstr = "Error : interupted";
320 sig_int_saved = signal(SIGINT, interrupt_report);
321 sig_alm_saved = signal(SIGALRM, interrupt_report);
324 setitimer(ITIMER_REAL, &val, NULL);
326 /* Unused in Windows */
330 /* プロキシが設定されていればプロキシに繋ぐ */
331 if (proxy && proxy[0])
333 if ((hp = gethostbyname(proxy)) == NULL)
336 errstr = "エラー: プロキシのアドレスが不正です";
338 errstr = "Error : wrong proxy addres";
346 else if ((hp = gethostbyname(host)) == NULL)
349 errstr = "エラー: サーバのアドレスが不正です";
351 errstr = "Error : wrong server adress";
359 memset(&to, 0, sizeof(to));
360 memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
362 to.sin_family = AF_INET;
364 if(proxy && proxy[0] && proxy_port)
365 to.sin_port = htons((unsigned short int)proxy_port);
367 to.sin_port = htons((unsigned short int)port);
370 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
372 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
376 errstr = "エラー: ソケットを生成できません";
378 errstr = "Error : cannot create socket.";
384 if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0)
387 errstr = "エラー: サーバに接続できません";
389 errstr = "Error : failed to connect server";
405 #else /* !MACINTOSH */
407 /* サーバにコネクトする関数。 Mac */
410 InetHostInfo response;
414 Boolean bind = false;
416 memset(&response, 0, sizeof(response));
418 #if TARGET_API_MAC_CARBON
419 inet_services = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, &err, NULL);
421 inet_services = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err);
426 if (proxy && proxy[0])
428 err = OTInetStringToAddress(inet_services, proxy, &response);
432 err = OTInetStringToAddress(inet_services, (char *)host, &response);
437 host_addr = response.addrs[0];
441 errstr = "error: bad score server!\n";
444 #if TARGET_API_MAC_CARBON
445 ep = (void *)OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err, NULL);
447 ep = (void *)OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
452 err = OTBind(ep, nil, nil);
453 bind = (err == noErr);
457 if (proxy && proxy[0] && proxy_port)
458 OTInitInetAddress(&inAddr, proxy_port, host_addr);
460 OTInitInetAddress(&inAddr, port, host_addr);
462 sndCall.addr.len = sizeof(InetAddress);
463 sndCall.addr.buf = (unsigned char*) &inAddr;
464 sndCall.opt.buf = nil; /* no connection options */
466 sndCall.udata.buf = nil; /* no connection data */
467 sndCall.udata.len = 0;
468 sndCall.sequence = 0; /* ignored by OTConnect */
470 err = OTConnect(ep, &sndCall, NULL);
474 errstr = "error: cannot connect score server!\n";
486 if (ep != kOTInvalidEndpointRef)
491 if (inet_services != nil)
493 OTCloseProvider(inet_services);
505 int disconnect_server(int sd)
508 return closesocket(sd);
509 #elif defined(MACINTOSH)
510 if (ep != kOTInvalidEndpointRef)
515 if (inet_services != nil)
517 OTCloseProvider(inet_services);
529 #endif /* WORLD_SCORE */