8 #include "io/files-util.h"
9 #include "util/angband-files.h"
16 #include <netinet/in.h>
17 #include <sys/socket.h>
19 #include <sys/types.h>
27 static concptr errstr;
29 static int proxy_port;
31 /* プロキシサーバのアドレスををファイルから読んで設定する */
32 void set_proxy(char *default_url, int default_port)
39 path_build(buf, sizeof(buf), ANGBAND_DIR_PREF, "proxy.prf");
42 fp = angband_fopen(buf, "r");
45 /* ファイルが存在しない場合はデフォルトを設定 */
47 proxy_port = default_port;
51 while (angband_fgets(fp, buf, sizeof(buf)) == 0) {
52 if (buf[0] != '#' && buf[0] != '\0')
61 /* "http://" から始まっている場合はその部分をカットする。 */
63 if (!strnicmp(s, "http://", 7)) {
67 if (!strncasecmp(s, "http://", 7)) {
72 /* 文字列の長さを調べ、必要なメモリを確保 */
74 proxy = malloc(len + 1);
76 /* ポート番号があるかどうかを調べ、あればproxy_portに設定。 */
78 while (len > 0 && isdigit((unsigned char)s[len]))
80 if (len > 0 && s[len] == ':' && s[len + 1] != '\0') {
83 proxy_port = atoi(s + (len + 1));
86 proxy_port = default_port;
89 /* プロキシのアドレスをproxyにコピー */
96 /* ソケットにバッファの内容を書き込む */
97 int soc_write(int sd, char *buf, size_t sz)
104 nwritten = send(sd, buf, nleft, 0);
114 int soc_read(int sd, char *buf, size_t sz)
116 int nleft, nread = 0;
122 n = recv(sd, buf + nread, nleft, 0);
132 #if !defined(WINDOWS)
133 static sigjmp_buf env;
134 static void (*sig_int_saved)(int);
135 static void (*sig_alm_saved)(int);
138 static void restore_signal(void)
140 #if !defined(WINDOWS)
141 struct itimerval val0;
144 val0.it_interval.tv_sec = 0;
145 val0.it_interval.tv_usec = 0;
146 val0.it_value.tv_sec = 0;
147 val0.it_value.tv_usec = 0;
150 setitimer(ITIMER_REAL, &val0, NULL);
151 signal(SIGALRM, sig_alm_saved);
152 signal(SIGINT, sig_int_saved);
156 #if !defined(WINDOWS)
157 static void interrupt_report(int sig)
160 siglongjmp(env, sig);
165 int connect_server(int timeout, concptr host, int port)
168 struct sockaddr_in to;
172 struct itimerval val;
176 val.it_interval.tv_sec = 0;
177 val.it_interval.tv_usec = 0;
178 val.it_value.tv_sec = timeout;
179 val.it_value.tv_usec = 0;
181 /* タイムアウト、もしくは中断した時の処理。 */
182 if ((ret = sigsetjmp(env, 1)) != 0) {
185 errstr = "エラー: タイムアウト";
187 errstr = "エラー: インタラプト";
190 errstr = "Error : time out";
192 errstr = "Error : interupted";
196 sig_int_saved = signal(SIGINT, interrupt_report);
197 sig_alm_saved = signal(SIGALRM, interrupt_report);
200 setitimer(ITIMER_REAL, &val, NULL);
202 /* Unused in Windows */
206 /* プロキシが設定されていればプロキシに繋ぐ */
207 if (proxy && proxy[0]) {
208 if ((hp = gethostbyname(proxy)) == NULL) {
210 errstr = "エラー: プロキシのアドレスが不正です";
212 errstr = "Error : wrong proxy addres";
219 } else if ((hp = gethostbyname(host)) == NULL) {
221 errstr = "エラー: サーバのアドレスが不正です";
223 errstr = "Error : wrong server adress";
231 memset(&to, 0, sizeof(to));
232 memcpy(&to.sin_addr, hp->h_addr_list[0], hp->h_length);
234 to.sin_family = AF_INET;
236 if (proxy && proxy[0] && proxy_port)
237 to.sin_port = htons((unsigned short int)proxy_port);
239 to.sin_port = htons((unsigned short int)port);
242 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
244 if ((sd = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
248 errstr = "エラー: ソケットを生成できません";
250 errstr = "Error : cannot create socket.";
256 if (connect(sd, (struct sockaddr *)&to, sizeof(to)) < 0) {
258 errstr = "エラー: サーバに接続できません";
260 errstr = "Error : failed to connect server";
276 int disconnect_server(int sd)
279 return closesocket(sd);
285 concptr soc_err() { return errstr; }
287 #endif /* WORLD_SCORE */