13 #elif defined(MACINTOSH)
14 #include <OpenTransport.h>
15 #include <OpenTptInternet.h>
17 #include <sys/types.h>
18 #include <sys/socket.h>
19 #include <netinet/in.h>
31 static int proxy_port;
34 static InetSvcRef inet_services = nil;
35 static EndpointRef ep = kOTInvalidEndpointRef;
38 #if 0 /* とりあえず現在は使わない。by Habu*/
47 homeurl = malloc(strlen(s) + 1);
64 static char buf[BUFSIZ];
66 if(proxy && proxy[0]){
68 snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
70 _snprintf(buf, sizeof(buf), "%s:%d", proxy, proxy_port);
72 buf[sizeof(buf)-1] = '\0';
91 int soc_read(int sd, char *buf, size_t sz)
94 return read(sd, buf, sz);
96 return recv(sd, buf, sz, 0);
102 /* プロキシサーバのアドレスををファイルから読んで設定する */
103 void set_proxy(char *default_url, int default_port)
115 path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, "proxy.prf");
118 fp = my_fopen(buf, "r");
122 /* ファイルが存在しない場合はデフォルトを設定 */
124 proxy_port = default_port;
128 while (my_fgets(fp, buf, sizeof(buf))==0)
130 if (buf[0] != '#' && buf[0] != '\0') break;
138 /* "http://" から始まっている場合はその部分をカットする。 */
140 if (!strnicmp(s, "http://", 7))
144 #elif defined(MACINTOSH)
145 strncpy( tmp , s , 7 );
146 for ( i = 0 ; i < 7 ; i++ )
148 if ( isalpha(tmp[i]) )
149 tmp[i]= tolower(tmp[i]);
151 if (!strncmp(s, "http://", 7))
156 if (!strncasecmp(s, "http://", 7))
162 /* 文字列の長さを調べ、必要なメモリを確保 */
164 proxy = malloc(len + 1);
166 /* ポート番号があるかどうかを調べ、あればproxy_portに設定。 */
168 while (len > 0 && isdigit((unsigned char)s[len]))
170 if (len > 0 && s[len] == ':' && s[len + 1] != '\0')
174 proxy_port = atoi(s + (len + 1));
179 proxy_port = default_port;
182 /* プロキシのアドレスをproxyにコピー */
189 /* ソケットにバッファの内容を書き込む */
190 int soc_write(int sd, char *buf, size_t sz)
198 nwritten = send(sd, buf, nleft, 0);
204 #else /* !MACINTOSH */
208 OTSnd(ep, (void *) buf, sz, 0);
214 int soc_read(int sd, char *buf, size_t sz)
217 int nleft, nread = 0;
223 n = recv(sd, buf + nread, nleft, 0);
229 #else /* !MACINTOSH */
233 OTSnd(ep, (void *)buf, sz, 0);
240 int soc_write_str(int sd, char *buf)
242 return soc_write(sd, buf, strlen(buf));
246 #if !defined(WINDOWS) && !defined(MACINTOSH)
247 static sigjmp_buf env;
248 static void (*sig_int_saved)(int);
249 static void (*sig_alm_saved)(int);
252 static void restore_signal(void)
254 #if !defined(WINDOWS) && !defined(MACINTOSH)
255 struct itimerval val0;
258 val0.it_interval.tv_sec = 0;
259 val0.it_interval.tv_usec = 0;
260 val0.it_value.tv_sec = 0;
261 val0.it_value.tv_usec = 0;
264 setitimer(ITIMER_REAL, &val0, NULL);
265 signal(SIGALRM, sig_alm_saved);
266 signal(SIGINT, sig_int_saved);
271 #if !defined(WINDOWS) && !defined(MACINTOSH)
272 static void interrupt_report(int sig)
275 siglongjmp(env, sig);
281 int connect_server(int timeout, const char *host, int port)
285 struct sockaddr_in to;
289 struct itimerval val;
293 val.it_interval.tv_sec = 0;
294 val.it_interval.tv_usec = 0;
295 val.it_value.tv_sec = timeout;
296 val.it_value.tv_usec = 0;
298 /* タイムアウト、もしくは中断した時の処理。 */
299 if ((ret = sigsetjmp(env,1)) != 0)
303 errstr = "エラー: タイムアウト";
305 errstr = "エラー: インタラプト";
308 errstr = "Error : time out";
310 errstr = "Error : interupted";
314 sig_int_saved = signal(SIGINT, interrupt_report);
315 sig_alm_saved = signal(SIGALRM, interrupt_report);
318 setitimer(ITIMER_REAL, &val, NULL);
320 /* Unused in Windows */
324 /* プロキシが設定されていればプロキシに繋ぐ */
325 if (proxy && proxy[0])
327 if ((hp = gethostbyname(proxy)) == NULL)
330 errstr = "エラー: プロキシのアドレスが不正です";
332 errstr = "Error : wrong proxy addres";
340 else if ((hp = gethostbyname(host)) == NULL)
343 errstr = "エラー: サーバのアドレスが不正です";
345 errstr = "Error : wrong server adress";
353 memset(&to, 0, sizeof(to));
354 memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
356 to.sin_family = AF_INET;
358 if(proxy && proxy[0] && proxy_port)
359 to.sin_port = htons((unsigned short int)proxy_port);
361 to.sin_port = htons((unsigned short int)port);
364 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
366 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
370 errstr = "エラー: ソケットを生成できません";
372 errstr = "Error : cannot create socket.";
378 if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0)
381 errstr = "エラー: サーバに接続できません";
383 errstr = "Error : failed to connect server";
399 #else /* !MACINTOSH */
401 /* サーバにコネクトする関数。 Mac */
404 InetHostInfo response;
408 Boolean bind = false;
410 memset(&response, 0, sizeof(response));
412 #if TARGET_API_MAC_CARBON
413 inet_services = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, &err, NULL);
415 inet_services = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err);
420 if (proxy && proxy[0])
422 err = OTInetStringToAddress(inet_services, proxy, &response);
426 err = OTInetStringToAddress(inet_services, (char *)host, &response);
431 host_addr = response.addrs[0];
435 errstr = "error: bad score server!\n";
438 #if TARGET_API_MAC_CARBON
439 ep = (void *)OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err, NULL);
441 ep = (void *)OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
446 err = OTBind(ep, nil, nil);
447 bind = (err == noErr);
451 if (proxy && proxy[0] && proxy_port)
452 OTInitInetAddress(&inAddr, proxy_port, host_addr);
454 OTInitInetAddress(&inAddr, port, host_addr);
456 sndCall.addr.len = sizeof(InetAddress);
457 sndCall.addr.buf = (unsigned char*) &inAddr;
458 sndCall.opt.buf = nil; /* no connection options */
460 sndCall.udata.buf = nil; /* no connection data */
461 sndCall.udata.len = 0;
462 sndCall.sequence = 0; /* ignored by OTConnect */
464 err = OTConnect(ep, &sndCall, NULL);
468 errstr = "error: cannot connect score server!\n";
480 if (ep != kOTInvalidEndpointRef)
485 if (inet_services != nil)
487 OTCloseProvider(inet_services);
499 int disconnect_server(int sd)
502 return closesocket(sd);
503 #elif defined(MACINTOSH)
504 if (ep != kOTInvalidEndpointRef)
509 if (inet_services != nil)
511 OTCloseProvider(inet_services);
523 #endif /* WORLD_SCORE */