diff --git a/README.md b/README.md
index 6dd43c2..c5f1a04 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-全平台命令行换源工具,**目标支持 Linux, Windows, macOS, BSD 等尽可能多的操作系统,龙芯、飞腾、RISC-V 等尽可能多的 CPU**。
+全平台命令行换源工具,**目标支持 Linux, Windows (MSYS2, Cygwin), macOS, BSD 等尽可能多的操作系统环境,龙芯、飞腾、RISC-V 等尽可能多的 CPU**。
我们使用 **C99** 来完成上述目标。我们并不使用 Python 或 JS 等解释语言,因为一个简单的换源工具,不应该强行塞给用户一个庞大的解释器和数十、数百 MB 其他文件。
diff --git a/include/chsrc.h b/include/chsrc.h
index 4401a28..cccd46c 100644
--- a/include/chsrc.h
+++ b/include/chsrc.h
@@ -6,8 +6,8 @@
* | Heng Guo <2085471348@qq.com>
* Contributors : Peng Gao
* |
- * Created on : <2023-08-29>
- * Last modified : <2024-09-04>
+ * Created On : <2023-08-29>
+ * Last Modified : <2024-09-05>
*
* chsrc 头文件
* ------------------------------------------------------------*/
@@ -436,16 +436,47 @@ measure_speed_for_url (void *url)
ipv6 = "--ipv6";
}
+
+ char *os_devnull = xy_os_devnull;
+ bool on_cygwin = false;
+
+ // https://github.com/RubyMetric/chsrc/issues/65
+ // curl (仅)在 Cygwin 上 -o nul 会把 nul 当做普通文件
+ // 为了践行 chsrc everywhere 的承诺,我们也考虑支持 Cygwin
+ if (0==system ("cygcheck --version>nul"))
+ {
+ on_cygwin = true;
+ os_devnull = "/tmp/chsrc-measure-downloaded";
+ }
+
// 我们用 —L,因为Ruby China源会跳转到其他地方
// npmmirror 也会跳转
- char *curl_cmd = xy_strjoin (7, "curl -qsL ", ipv6,
- " -o " xy_os_devnull,
+ char *curl_cmd = xy_strjoin (8, "curl -qsL ", ipv6,
+ " -o ", os_devnull,
" -w \"%{http_code} %{speed_download}\" -m", time_sec,
" -A chsrc/" Chsrc_Banner_Version " ", url);
// chsrc_info (xy_2strjoin ("测速命令 ", curl_cmd));
- char *curl_buf = xy_run (curl_cmd, 0, NULL);
+ char *curl_buf = NULL;
+
+ if (on_cygwin)
+ {
+ char *curl_script = ".chsrc_measure_tmp.sh";
+ FILE *f = fopen (curl_script, "w");
+ if (f==NULL)
+ exit (Exit_UserCause);
+ fputs (curl_cmd, f);
+ fclose (f);
+ curl_buf = xy_run ( xy_2strjoin ("bash .\\", curl_script), 0, NULL);
+ system (xy_2strjoin ("del ", curl_script));
+ system (xy_strjoin (3, "bash -c \"rm ", os_devnull, "\""));
+ }
+ else
+ {
+ curl_buf = xy_run (curl_cmd, 0, NULL);
+ }
+
// 如果尾部有换行,删除
curl_buf = xy_str_strip (curl_buf);