18 #include <sys/types.h>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
30 static concptr errstr;
32 static int proxy_port;
36 /* プロキシサーバのアドレスををファイルから読んで設定する */
37 void set_proxy(char *default_url, int default_port)
44 path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, "proxy.prf");
47 fp = my_fopen(buf, "r");
51 /* ファイルが存在しない場合はデフォルトを設定 */
53 proxy_port = default_port;
57 while (my_fgets(fp, buf, sizeof(buf)) == 0)
59 if (buf[0] != '#' && buf[0] != '\0') break;
67 /* "http://" から始まっている場合はその部分をカットする。 */
69 if (!strnicmp(s, "http://", 7))
74 if (!strncasecmp(s, "http://", 7))
80 /* 文字列の長さを調べ、必要なメモリを確保 */
82 proxy = malloc(len + 1);
84 /* ポート番号があるかどうかを調べ、あればproxy_portに設定。 */
86 while (len > 0 && isdigit((unsigned char)s[len]))
88 if (len > 0 && s[len] == ':' && s[len + 1] != '\0')
92 proxy_port = atoi(s + (len + 1));
97 proxy_port = default_port;
100 /* プロキシのアドレスをproxyにコピー */
107 /* ソケットにバッファの内容を書き込む */
108 int soc_write(int sd, char *buf, size_t sz)
115 nwritten = send(sd, buf, nleft, 0);
125 int soc_read(int sd, char *buf, size_t sz)
127 int nleft, nread = 0;
133 n = recv(sd, buf + nread, nleft, 0);
143 #if !defined(WINDOWS)
144 static sigjmp_buf env;
145 static void(*sig_int_saved)(int);
146 static void(*sig_alm_saved)(int);
149 static void restore_signal(void)
151 #if !defined(WINDOWS)
152 struct itimerval val0;
155 val0.it_interval.tv_sec = 0;
156 val0.it_interval.tv_usec = 0;
157 val0.it_value.tv_sec = 0;
158 val0.it_value.tv_usec = 0;
161 setitimer(ITIMER_REAL, &val0, NULL);
162 signal(SIGALRM, sig_alm_saved);
163 signal(SIGINT, sig_int_saved);
168 #if !defined(WINDOWS)
169 static void interrupt_report(int sig)
172 siglongjmp(env, sig);
178 int connect_server(int timeout, concptr host, int port)
181 struct sockaddr_in to;
185 struct itimerval val;
189 val.it_interval.tv_sec = 0;
190 val.it_interval.tv_usec = 0;
191 val.it_value.tv_sec = timeout;
192 val.it_value.tv_usec = 0;
194 /* タイムアウト、もしくは中断した時の処理。 */
195 if ((ret = sigsetjmp(env, 1)) != 0)
199 errstr = "エラー: タイムアウト";
201 errstr = "エラー: インタラプト";
204 errstr = "Error : time out";
206 errstr = "Error : interupted";
210 sig_int_saved = signal(SIGINT, interrupt_report);
211 sig_alm_saved = signal(SIGALRM, interrupt_report);
214 setitimer(ITIMER_REAL, &val, NULL);
216 /* Unused in Windows */
220 /* プロキシが設定されていればプロキシに繋ぐ */
221 if (proxy && proxy[0])
223 if ((hp = gethostbyname(proxy)) == NULL)
226 errstr = "エラー: プロキシのアドレスが不正です";
228 errstr = "Error : wrong proxy addres";
236 else if ((hp = gethostbyname(host)) == NULL)
239 errstr = "エラー: サーバのアドレスが不正です";
241 errstr = "Error : wrong server adress";
249 memset(&to, 0, sizeof(to));
250 memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
252 to.sin_family = AF_INET;
254 if (proxy && proxy[0] && proxy_port)
255 to.sin_port = htons((unsigned short int)proxy_port);
257 to.sin_port = htons((unsigned short int)port);
260 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
262 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
266 errstr = "エラー: ソケットを生成できません";
268 errstr = "Error : cannot create socket.";
274 if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0)
277 errstr = "エラー: サーバに接続できません";
279 errstr = "Error : failed to connect server";
296 int disconnect_server(int sd)
299 return closesocket(sd);
310 #endif /* WORLD_SCORE */