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);
215 int soc_write_str(int sd, char *buf)
217 return soc_write(sd, buf, strlen(buf));
221 #if !defined(WINDOWS) && !defined(MACINTOSH)
222 static sigjmp_buf env;
223 static void (*sig_int_saved)(int);
224 static void (*sig_alm_saved)(int);
227 static void restore_signal(void)
229 #if !defined(WINDOWS) && !defined(MACINTOSH)
230 struct itimerval val0;
233 val0.it_interval.tv_sec = 0;
234 val0.it_interval.tv_usec = 0;
235 val0.it_value.tv_sec = 0;
236 val0.it_value.tv_usec = 0;
239 setitimer(ITIMER_REAL, &val0, NULL);
240 signal(SIGALRM, sig_alm_saved);
241 signal(SIGINT, sig_int_saved);
246 #if !defined(WINDOWS) && !defined(MACINTOSH)
247 static void interrupt_report(int sig)
250 siglongjmp(env, sig);
256 int connect_server(int timeout, const char *host, int port)
260 struct sockaddr_in to;
264 struct itimerval val;
268 val.it_interval.tv_sec = 0;
269 val.it_interval.tv_usec = 0;
270 val.it_value.tv_sec = timeout;
271 val.it_value.tv_usec = 0;
273 /* タイムアウト、もしくは中断した時の処理。 */
274 if ((ret = sigsetjmp(env,1)) != 0)
278 errstr = "エラー: タイムアウト";
280 errstr = "エラー: インタラプト";
283 errstr = "Error : time out";
285 errstr = "Error : interupted";
289 sig_int_saved = signal(SIGINT, interrupt_report);
290 sig_alm_saved = signal(SIGALRM, interrupt_report);
293 setitimer(ITIMER_REAL, &val, NULL);
295 /* Unused in Windows */
299 /* プロキシが設定されていればプロキシに繋ぐ */
300 if (proxy && proxy[0])
302 if ((hp = gethostbyname(proxy)) == NULL)
305 errstr = "エラー: プロキシのアドレスが不正です";
307 errstr = "Error : wrong proxy addres";
315 else if ((hp = gethostbyname(host)) == NULL)
318 errstr = "エラー: サーバのアドレスが不正です";
320 errstr = "Error : wrong server adress";
328 memset(&to, 0, sizeof(to));
329 memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
331 to.sin_family = AF_INET;
333 if(proxy && proxy[0] && proxy_port)
334 to.sin_port = htons((unsigned short int)proxy_port);
336 to.sin_port = htons((unsigned short int)port);
339 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
341 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
345 errstr = "エラー: ソケットを生成できません";
347 errstr = "Error : cannot create socket.";
353 if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0)
356 errstr = "エラー: サーバに接続できません";
358 errstr = "Error : failed to connect server";
374 #else /* !MACINTOSH */
376 /* サーバにコネクトする関数。 Mac */
379 InetHostInfo response;
383 Boolean bind = false;
385 memset(&response, 0, sizeof(response));
387 #if TARGET_API_MAC_CARBON
388 inet_services = OTOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, &err, NULL);
390 inet_services = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err);
395 if (proxy && proxy[0])
397 err = OTInetStringToAddress(inet_services, proxy, &response);
401 err = OTInetStringToAddress(inet_services, (char *)host, &response);
406 host_addr = response.addrs[0];
410 errstr = "error: bad score server!\n";
413 #if TARGET_API_MAC_CARBON
414 ep = (void *)OTOpenEndpointInContext(OTCreateConfiguration(kTCPName), 0, nil, &err, NULL);
416 ep = (void *)OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
421 err = OTBind(ep, nil, nil);
422 bind = (err == noErr);
426 if (proxy && proxy[0] && proxy_port)
427 OTInitInetAddress(&inAddr, proxy_port, host_addr);
429 OTInitInetAddress(&inAddr, port, host_addr);
431 sndCall.addr.len = sizeof(InetAddress);
432 sndCall.addr.buf = (unsigned char*) &inAddr;
433 sndCall.opt.buf = nil; /* no connection options */
435 sndCall.udata.buf = nil; /* no connection data */
436 sndCall.udata.len = 0;
437 sndCall.sequence = 0; /* ignored by OTConnect */
439 err = OTConnect(ep, &sndCall, NULL);
443 errstr = "error: cannot connect score server!\n";
455 if (ep != kOTInvalidEndpointRef)
460 if (inet_services != nil)
462 OTCloseProvider(inet_services);
474 int disconnect_server(int sd)
477 return closesocket(sd);
478 #elif defined(MACINTOSH)
479 if (ep != kOTInvalidEndpointRef)
484 if (inet_services != nil)
486 OTCloseProvider(inet_services);
498 #endif /* WORLD_SCORE */