両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン |
rust [2024/05/05 04:41] – [Rust の更新] ともやん | rust [2024/05/20 16:15] – [ORM - Object Relational Mapper] ともやん |
---|
<WRAP color_command><html><pre> | <WRAP color_command><html><pre> |
<font color="#FF8700"><b>$</b></font> <font color="#26A269">rustup</font> self update | <font color="#FF8700"><b>$</b></font> <font color="#26A269">rustup</font> self update |
| </pre></html></WRAP> |
<WRAP color_result><html><pre> | <WRAP color_result><html><pre> |
<b>info: </b>checking for self-update | <b>info: </b>checking for self-update |
<b>info: </b>downloading self-update | <b>info: </b>downloading self-update |
<font color="#26A269"><b>rustup updated</b></font> - 1.27.0 (from 1.26.0) | <font color="#26A269"><b>rustup updated</b></font> - 1.27.1 (from 1.27.0) |
</pre></html></WRAP> | </pre></html></WRAP> |
<WRAP color_command><html><pre> | <WRAP color_command><html><pre> |
<font color="#FF8700"><b>$</b></font> <font color="#26A269">rustup</font> <font color="#A347BA">-V</font> | <font color="#FF8700"><b>$</b></font> <font color="#26A269">rustup</font> <font color="#A347BA">-V</font> |
</pre></html></WRAP> | </pre></html></WRAP> |
<WRAP color_result><html><pre> | <WRAP color_result><html><pre> |
rustup 1.27.0 (bbb9276d2 2024-03-08) | rustup 1.27.1 (54dd3d00f 2024-04-24) |
<b>info: </b>This is the version for the rustup toolchain manager, not the rustc compiler. | <b>info: </b>This is the version for the rustup toolchain manager, not the rustc compiler. |
<b>info: </b>The currently active `rustc` version is `rustc 1.74.1 (a28077b28 2023-12-04) | <b>info: </b>The currently active `rustc` version is `rustc 1.77.2 (25ef9e3d8 2024-04-09)` |
</pre></html></WRAP> | </pre></html></WRAP> |
</WRAP> | </WRAP> |
<font color="#FF8700"><b>$</b></font> <font color="#26A269">rustup</font> update | <font color="#FF8700"><b>$</b></font> <font color="#26A269">rustup</font> update |
</pre></html></WRAP> | </pre></html></WRAP> |
<WRAP color_result_long><html><pre> | <WRAP color_result_hlong><html><pre> |
<b>info: </b>syncing channel updates for 'stable-x86_64-unknown-linux-gnu' | <b>info: </b>syncing channel updates for 'stable-x86_64-unknown-linux-gnu' |
<b>info: </b>latest update on 2024-03-21, rust version 1.77.0 (aedd173a2 2024-03-17) | 730.9 KiB / 730.9 KiB (100 %) 463.2 KiB/s in 1s ETA: 0s |
<b>info: </b>downloading component 'rust-std' for 'thumbv6m-none-eabi' | <b>info: </b>latest update on 2024-05-02, rust version 1.78.0 (9b00956e5 2024-04-29) |
9.1 MiB / 9.1 MiB (100 %) 3.2 MiB/s in 2s ETA: 0s | |
<b>info: </b>downloading component 'rust-std' for 'arm-unknown-linux-gnueabihf' | |
21.0 MiB / 21.0 MiB (100 %) 2.3 MiB/s in 8s ETA: 0s | |
<b>info: </b>downloading component 'rust-src' | <b>info: </b>downloading component 'rust-src' |
2.5 MiB / 2.5 MiB (100 %) 2.2 MiB/s in 1s ETA: 0s | 2.5 MiB / 2.5 MiB (100 %) 732.1 KiB/s in 4s ETA: 0s |
<b>info: </b>downloading component 'cargo' | <b>info: </b>downloading component 'cargo' |
8.0 MiB / 8.0 MiB (100 %) 1.3 MiB/s in 6s ETA: 0s | 8.0 MiB / 8.0 MiB (100 %) 662.4 KiB/s in 13s ETA: 0s |
<b>info: </b>downloading component 'clippy' | <b>info: </b>downloading component 'clippy' |
| 2.3 MiB / 2.3 MiB (100 %) 627.0 KiB/s in 3s ETA: 0s |
<b>info: </b>downloading component 'rust-docs' | <b>info: </b>downloading component 'rust-docs' |
14.9 MiB / 14.9 MiB (100 %) 1.7 MiB/s in 10s ETA: 0s | 15.1 MiB / 15.1 MiB (100 %) 483.2 KiB/s in 25s ETA: 0s |
<b>info: </b>downloading component 'rust-std' | <b>info: </b>downloading component 'rust-std' |
26.6 MiB / 26.6 MiB (100 %) 2.2 MiB/s in 17s ETA: 0s | 24.3 MiB / 24.3 MiB (100 %) 522.4 KiB/s in 42s ETA: 0s |
<b>info: </b>downloading component 'rustc' | <b>info: </b>downloading component 'rustc' |
60.3 MiB / 60.3 MiB (100 %) 3.1 MiB/s in 26s ETA: 0s | 63.7 MiB / 63.7 MiB (100 %) 256.0 KiB/s in 2m 37s ETA: 0s |
<b>info: </b>downloading component 'rustfmt' | <b>info: </b>downloading component 'rustfmt' |
<b>info: </b>removing previous version of component 'rust-std' for 'thumbv6m-none-eabi' | 2.3 MiB / 2.3 MiB (100 %) 411.8 KiB/s in 6s ETA: 0s |
<b>info: </b>removing previous version of component 'rust-std' for 'arm-unknown-linux-gnueabihf' | |
<b>info: </b>removing previous version of component 'rust-src' | <b>info: </b>removing previous version of component 'rust-src' |
<b>info: </b>removing previous version of component 'cargo' | <b>info: </b>removing previous version of component 'cargo' |
<b>info: </b>removing previous version of component 'rustc' | <b>info: </b>removing previous version of component 'rustc' |
<b>info: </b>removing previous version of component 'rustfmt' | <b>info: </b>removing previous version of component 'rustfmt' |
<b>info: </b>installing component 'rust-std' for 'thumbv6m-none-eabi' | |
9.1 MiB / 9.1 MiB (100 %) 8.3 MiB/s in 2s ETA: 0s | |
<b>info: </b>installing component 'rust-std' for 'arm-unknown-linux-gnueabihf' | |
21.0 MiB / 21.0 MiB (100 %) 8.1 MiB/s in 2s ETA: 0s | |
<b>info: </b>installing component 'rust-src' | <b>info: </b>installing component 'rust-src' |
<b>info: </b>installing component 'cargo' | <b>info: </b>installing component 'cargo' |
<b>info: </b>installing component 'clippy' | <b>info: </b>installing component 'clippy' |
<b>info: </b>installing component 'rust-docs' | <b>info: </b>installing component 'rust-docs' |
14.9 MiB / 14.9 MiB (100 %) 3.7 MiB/s in 4s ETA: 0s | 15.1 MiB / 15.1 MiB (100 %) 4.4 MiB/s in 3s ETA: 0s |
<b>info: </b>installing component 'rust-std' | <b>info: </b>installing component 'rust-std' |
26.6 MiB / 26.6 MiB (100 %) 6.5 MiB/s in 4s ETA: 0s | 24.3 MiB / 24.3 MiB (100 %) 6.7 MiB/s in 3s ETA: 0s |
<b>info: </b>installing component 'rustc' | <b>info: </b>installing component 'rustc' |
60.3 MiB / 60.3 MiB (100 %) 5.6 MiB/s in 10s ETA: 0s | 63.7 MiB / 63.7 MiB (100 %) 9.3 MiB/s in 7s ETA: 0s |
<b>info: </b>installing component 'rustfmt' | <b>info: </b>installing component 'rustfmt' |
<b>info: </b>syncing channel updates for 'nightly-x86_64-unknown-linux-gnu' | |
756.5 KiB / 756.5 KiB (100 %) 327.7 KiB/s in 3s ETA: 0s | |
<b>info: </b>latest update on 2024-03-25, rust version 1.79.0-nightly (0824b300e 2024-03-24) | |
<b>info: </b>downloading component 'rust-src' | |
2.5 MiB / 2.5 MiB (100 %) 515.1 KiB/s in 6s ETA: 0s | |
<b>info: </b>downloading component 'rust-std' for 'riscv32imac-unknown-none-elf' | |
9.2 MiB / 9.2 MiB (100 %) 2.2 MiB/s in 4s ETA: 0s | |
<b>info: </b>downloading component 'rust-std' for 'riscv32imc-unknown-none-elf' | |
9.0 MiB / 9.0 MiB (100 %) 3.9 MiB/s in 9s ETA: 0s | |
<b>info: </b>downloading component 'llvm-tools' | |
31.3 MiB / 31.3 MiB (100 %) 690.1 KiB/s in 2m 43s ETA: 0s | |
<b>info: </b>downloading component 'cargo' | |
8.1 MiB / 8.1 MiB (100 %) 3.6 MiB/s in 2s ETA: 0s | |
<b>info: </b>downloading component 'rust-std' | |
26.3 MiB / 26.3 MiB (100 %) 4.4 MiB/s in 6s ETA: 0s | |
<b>info: </b>downloading component 'rustc' | |
64.8 MiB / 64.8 MiB (100 %) 4.2 MiB/s in 20s ETA: 0s | |
<b>info: </b>removing previous version of component 'rust-src' | |
<b>info: </b>removing previous version of component 'rust-std' for 'riscv32imac-unknown-none-elf' | |
<b>info: </b>removing previous version of component 'rust-std' for 'riscv32imc-unknown-none-elf' | |
<b>info: </b>removing previous version of component 'llvm-tools' | |
<b>info: </b>removing previous version of component 'cargo' | |
<b>info: </b>removing previous version of component 'rust-std' | |
<b>info: </b>removing previous version of component 'rustc' | |
<b>info: </b>installing component 'rust-src' | |
<b>info: </b>installing component 'rust-std' for 'riscv32imac-unknown-none-elf' | |
9.2 MiB / 9.2 MiB (100 %) 8.5 MiB/s in 1s ETA: 0s | |
<b>info: </b>installing component 'rust-std' for 'riscv32imc-unknown-none-elf' | |
9.0 MiB / 9.0 MiB (100 %) 8.5 MiB/s in 1s ETA: 0s | |
<b>info: </b>installing component 'llvm-tools' | |
31.3 MiB / 31.3 MiB (100 %) 9.2 MiB/s in 3s ETA: 0s | |
<b>info: </b>installing component 'cargo' | |
<b>info: </b>installing component 'rust-std' | |
26.3 MiB / 26.3 MiB (100 %) 8.5 MiB/s in 3s ETA: 0s | |
<b>info: </b>installing component 'rustc' | |
64.8 MiB / 64.8 MiB (100 %) 7.3 MiB/s in 8s ETA: 0s | |
<b>info: </b>checking for self-update | <b>info: </b>checking for self-update |
| |
<font color="#26A269"><b>stable-x86_64-unknown-linux-gnu updated</b></font> - rustc 1.77.0 (aedd173a2 2024-03-17) (from rustc 1.74.1 (a28077b28 2023-12-04)) | <font color="#26A269"><b>stable-x86_64-unknown-linux-gnu updated</b></font> - rustc 1.78.0 (9b00956e5 2024-04-29) (from rustc 1.65.0 (897e37553 2022-11-02)) |
<font color="#26A269"><b>nightly-x86_64-unknown-linux-gnu updated</b></font> - rustc 1.79.0-nightly (0824b300e 2024-03-24) (from (timeout reading rustc version)) | |
| |
<b>info: </b>cleaning up downloads & tmp directories | <b>info: </b>cleaning up downloads & tmp directories |
[[https://langserver.org/|Langserver.org]]\\ | [[https://langserver.org/|Langserver.org]]\\ |
| |
==== Web Framework ==== | ==== Application Frameworks ==== |
[[https://trends.google.com/trends/explore?cat=31&date=2015-01-01%202023-09-07&q=Actix%20Web,Axum%20Rust,Rocket%20Rust,Gotham%20Rust,Tide%20Rust&hl=ja|Actix Web, Axum Rust, Rocket Rust, Gotham Rust, Tide Rust - 調べる - Google トレンド]]\\ | [[https://trends.google.com/trends/explore?cat=31&date=2015-01-01%202023-09-07&q=Actix%20Web,Axum%20Rust,Rocket%20Rust,Gotham%20Rust,Tide%20Rust&hl=ja|Actix Web, Axum Rust, Rocket Rust, Gotham Rust, Tide Rust - 調べる - Google トレンド]]\\ |
[[https://www.shuttle.rs/blog/2023/08/23/rust-web-framework-comparison|Best Rust Web Frameworks to Use in 2023]] [[gtr>https://www.shuttle.rs/blog/2023/08/23/rust-web-framework-comparison|翻訳]]\\ | 参考: [[https://www.shuttle.rs/blog/2023/08/23/rust-web-framework-comparison|Best Rust Web Frameworks to Use in 2023]] [[gtr>https://www.shuttle.rs/blog/2023/08/23/rust-web-framework-comparison|翻訳]]\\ |
| [[https://fettblog.eu/slides/microservices-with-rust-and-tokio/|Microservices with Rust and Tokio | Slides + Coverage]]\\ |
| |
| 以下は 2024/05/16 現在 [[https://www.shuttle.rs/|Shuttle - Build Backends Fast]] のテンプレートで選択できるフレームワークの一覧...🤔\\ |
| <html><style> |
| .wrap_rust-framework table .col0 { |
| width: 230px; |
| } |
| </style></html> |
| <WRAP mintbl rust-framework> |
| | [[https://actix.rs/|Actix]] | 強力で高速な Web フレームワーク | |
| | [[https://docs.rs/axum/|axum - Rust]] | Tokio エコシステムのモジュラー Web フレームワーク | |
| | [[https://bevyengine.org/|Bevy Engine]] | WASM にコンパイルされるデータ駆動型ゲーム エンジン | |
| | [[https://loco.rs/|Loco | Loco]] | バッテリー付属の Axum に基づく Web フレームワーク | |
| | [[https://docs.rs/poem/|poem - Rust]] | フル機能を備えた使いやすい Web フレームワーク | |
| | [[https://docs.rs/poise/|poise - Rust]] | 優れたスラッシュコマンドサポートを備えた Discord Bot フレームワーク | |
| | [[https://rocket.rs/|Rocket - Simple, Fast, Type-Safe Web Framework for Rust]] | シンプルで使いやすいWebフレームワーク | |
| | [[https://salvo.rs/|Home | Salvo]] | フル機能を備えた使いやすい Web フレームワーク | |
| | [[https://docs.rs/serenity/|serenity - Rust]] | Discordボットフレームワーク | |
| | [[https://docs.rs/thruster/|thruster - Rust]] | Web フレームワーク | |
| | [[https://docs.rs/tide/|tide - Rust]] | Web フレームワーク | |
| | [[https://docs.rs/tower/|tower - Rust]] | モジュラーサービスライブラリ | |
| | [[https://docs.rs/warp/|warp - Rust]] | Web フレームワーク | |
| </WRAP> |
| |
| Rust / Wasm クライアント Web アプリ フレームワーク\\ |
| [[https://yew.rs/|Yew]]\\ |
| |
| 非同期ランタイム\\ |
| [[https://tokio.rs/|Tokio - An asynchronous Rust runtime]]\\ |
| Rust 用の WebAssembly (WASM) Web アプリケーション バンドラー\\ |
| [[https://trunkrs.dev/|Trunk | Build, bundle & ship your Rust WASM application to the web]]\\ |
| |
| Rust 用のエレガントな GUI ライブラリ\\ |
| [[https://dioxuslabs.com/|Dioxus | An elegant GUI library for Rust]]\\ |
| |
| ==== ORM - Object Relational Mapper ==== |
| 参考: [[https://www.shuttle.rs/blog/2024/01/16/best-orm-rust|A Guide to Rust ORMs in 2024]] [[gtr>https://www.shuttle.rs/blog/2024/01/16/best-orm-rust|翻訳]]\\ |
| |
| === SeaORM === |
| 公式: [[https://www.sea-ql.org/SeaORM/|SeaORM 🐚 An async & dynamic ORM for Rust]]\\ |
| ソースコード: [[git>SeaQL/sea-orm|SeaQL/sea-orm: 🐚 An async & dynamic ORM for Rust]]\\ |
| |
| === Diesel === |
| 公式: [[https://diesel.rs/|Diesel is a Safe, Extensible ORM and Query Builder for Rust]]\\ |
| ソースコード: [[git>diesel-rs/diesel|diesel-rs/diesel: A safe, extensible ORM and Query Builder for Rust]]\\ |
| |
| [[.rust:diesel|Diesel]]\\ |
| |
==== Web ベースの Rust シミュレーター ==== | ==== Web ベースの Rust シミュレーター ==== |
==== 付録 ==== | ==== 付録 ==== |
インストーラスクリプトの内容\\ | インストーラスクリプトの内容\\ |
<WRAP mincode><code> | <WRAP color_term> |
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | cat | <WRAP color_command><html><pre> |
</code></WRAP> | <font color="#0087FF"><b>$</b></font> <font color="#26A269">curl</font> <font color="#A347BA">--proto</font> <font color="#A2734C">'=https'</font> <font color="#A347BA">--tlsv1.2</font> <font color="#A347BA">-sSf</font> https://sh.rustup.rs <font color="#12488B"><b>|</b></font> <font color="#26A269">bat</font> <font color="#A347BA">-p</font> <font color="#A347BA">-l</font> sh <font color="#A347BA">--pager</font> never |
<WRAP mincode_long><code bash> | </pre></html></WRAP> |
#!/bin/sh | <WRAP color_result_long><html><pre class=bat> |
# shellcheck shell=dash | <font color="#7C7865">#!/bin/sh</font> |
| <font color="#7C7865"># shellcheck shell=dash</font> |
| <font color="#7C7865"># shellcheck disable=SC2039 # local is non-POSIX</font> |
| |
# This is just a little script that can be downloaded from the internet to | <font color="#7C7865"># This is just a little script that can be downloaded from the internet to</font> |
# install rustup. It just does platform detection, downloads the installer | <font color="#7C7865"># install rustup. It just does platform detection, downloads the installer</font> |
# and runs it. | <font color="#7C7865"># and runs it.</font> |
| |
# It runs on Unix shells like {a,ba,da,k,z}sh. It uses the common `local` | <font color="#7C7865"># It runs on Unix shells like {a,ba,da,k,z}sh. It uses the common `local`</font> |
# extension. Note: Most shells limit `local` to 1 var per line, contra bash. | <font color="#7C7865"># extension. Note: Most shells limit `local` to 1 var per line, contra bash.</font> |
| |
if [ "$KSH_VERSION" = 'Version JM 93t+ 2010-03-05' ]; then | <font color="#7C7865"># Some versions of ksh have no `local` keyword. Alias it to `typeset`, but</font> |
# The version of ksh93 that ships with many illumos systems does not | <font color="#7C7865"># beware this makes variables global with f()-style function syntax in ksh93.</font> |
# support the "local" extension. Print a message rather than fail in | <font color="#7C7865"># mksh has this alias by default.</font> |
# subtle ways later on: | <font color="#A6E22E">has_local</font><font color="#FFFFFF">() {</font> |
echo 'rustup does not work with this ksh93 version; please try bash!' >&2 | <font color="#FFFFFF"> </font><font color="#7C7865"># shellcheck disable=SC2034 # deliberately unused</font> |
exit 1 | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _has_local</font> |
fi | <font color="#FFFFFF">}</font> |
| |
| <font color="#FFFFFF">has_local </font><font color="#BE84FF">2</font><font color="#F92672">></font><font color="#FFFFFF">/dev/null </font><font color="#F92672">||</font><font color="#FFFFFF"> </font><font color="#66D9EF">alias</font><font color="#FFFFFF"> </font><font color="#A6E22E">local</font><font color="#F92672">=</font><font color="#E6DB74">typeset</font> |
| |
set -u | <font color="#A6E22E">is_zsh</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">ZSH_VERSION</font><font color="#F92672">-</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font> |
| <font color="#FFFFFF">}</font> |
| |
# If RUSTUP_UPDATE_ROOT is unset or empty, default it. | <font color="#66D9EF">set</font><font color="#FFFFFF"> </font><font color="#FD971F">-u</font> |
RUSTUP_UPDATE_ROOT="${RUSTUP_UPDATE_ROOT:-https://static.rust-lang.org/rustup}" | |
| |
#XXX: If you change anything here, please make the same changes in setup_mode.rs | <font color="#7C7865"># If RUSTUP_UPDATE_ROOT is unset or empty, default it.</font> |
usage() { | <font color="#FFFFFF">RUSTUP_UPDATE_ROOT</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">RUSTUP_UPDATE_ROOT</font><font color="#F92672">:-</font><font color="#E6DB74">https://static.rust-lang.org/rustup}</font><font color="#FFFFFF">"</font> |
cat 1>&2 <<EOF | |
rustup-init 1.24.3 (c1c769109 2021-05-31) | |
The installer for rustup | |
| |
USAGE: | <font color="#7C7865"># NOTICE: If you change anything here, please make the same changes in setup_mode.rs</font> |
rustup-init [FLAGS] [OPTIONS] | <font color="#A6E22E">usage</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> cat </font><font color="#F92672"><<EOF</font> |
| <font color="#E6DB74">rustup-init 1.27.1 (a8e4f5c64 2024-04-24)</font> |
| |
FLAGS: | <font color="#E6DB74">The installer for rustup</font> |
-v, --verbose Enable verbose output | |
-q, --quiet Disable progress output | |
-y Disable confirmation prompt. | |
--no-modify-path Don't configure the PATH environment variable | |
-h, --help Prints help information | |
-V, --version Prints version information | |
| |
OPTIONS: | <font color="#E6DB74">Usage: rustup-init[EXE] [OPTIONS]</font> |
--default-host <default-host> Choose a default host triple | |
--default-toolchain <default-toolchain> Choose a default toolchain to install | |
--default-toolchain none Do not install any toolchains | |
--profile [minimal|default|complete] Choose a profile | |
-c, --component <components>... Component name to also install | |
-t, --target <targets>... Target name to also install | |
EOF | |
} | |
| |
main() { | <font color="#E6DB74">Options:</font> |
downloader --check | <font color="#E6DB74"> -v, --verbose</font> |
need_cmd uname | <font color="#E6DB74"> Enable verbose output</font> |
need_cmd mktemp | <font color="#E6DB74"> -q, --quiet</font> |
need_cmd chmod | <font color="#E6DB74"> Disable progress output</font> |
need_cmd mkdir | <font color="#E6DB74"> -y</font> |
need_cmd rm | <font color="#E6DB74"> Disable confirmation prompt.</font> |
need_cmd rmdir | <font color="#E6DB74"> --default-host <default-host></font> |
| <font color="#E6DB74"> Choose a default host triple</font> |
| <font color="#E6DB74"> --default-toolchain <default-toolchain></font> |
| <font color="#E6DB74"> Choose a default toolchain to install. Use 'none' to not install any toolchains at all</font> |
| <font color="#E6DB74"> --profile <profile></font> |
| <font color="#E6DB74"> [default: default] [possible values: minimal, default, complete]</font> |
| <font color="#E6DB74"> -c, --component <components>...</font> |
| <font color="#E6DB74"> Component name to also install</font> |
| <font color="#E6DB74"> -t, --target <targets>...</font> |
| <font color="#E6DB74"> Target name to also install</font> |
| <font color="#E6DB74"> --no-update-default-toolchain</font> |
| <font color="#E6DB74"> Don't update any existing default toolchain after install</font> |
| <font color="#E6DB74"> --no-modify-path</font> |
| <font color="#E6DB74"> Don't configure the PATH environment variable</font> |
| <font color="#E6DB74"> -h, --help</font> |
| <font color="#E6DB74"> Print help</font> |
| <font color="#E6DB74"> -V, --version</font> |
| <font color="#E6DB74"> Print version</font> |
| <font color="#F92672">EOF</font> |
| <font color="#FFFFFF">}</font> |
| |
get_architecture || return 1 | <font color="#A6E22E">main</font><font color="#FFFFFF">() {</font> |
local _arch="$RETVAL" | <font color="#FFFFFF"> downloader</font><font color="#FD971F"> --check</font> |
assert_nz "$_arch" "arch" | <font color="#FFFFFF"> need_cmd uname</font> |
| <font color="#FFFFFF"> need_cmd mktemp</font> |
| <font color="#FFFFFF"> need_cmd chmod</font> |
| <font color="#FFFFFF"> need_cmd mkdir</font> |
| <font color="#FFFFFF"> need_cmd rm</font> |
| <font color="#FFFFFF"> need_cmd rmdir</font> |
| |
local _ext="" | <font color="#FFFFFF"> get_architecture </font><font color="#F92672">||</font><font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> 1</font> |
case "$_arch" in | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _arch</font><font color="#F92672">=</font><font color="#FFFFFF">"$RETVAL"</font> |
*windows*) | <font color="#FFFFFF"> assert_nz "$_arch" "</font><font color="#E6DB74">arch</font><font color="#FFFFFF">"</font> |
_ext=".exe" | |
;; | |
esac | |
| |
local _url="${RUSTUP_UPDATE_ROOT}/dist/${_arch}/rustup-init${_ext}" | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _ext</font><font color="#F92672">=</font><font color="#FFFFFF">""</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$_arch" </font><font color="#F92672">in</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">*</font><font color="#FFFFFF">windows</font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> _ext</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">.exe</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
| |
local _dir | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _url</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">RUSTUP_UPDATE_ROOT</font><font color="#E6DB74">}/dist/</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_arch</font><font color="#E6DB74">}/rustup-init</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ext</font><font color="#E6DB74">}</font><font color="#FFFFFF">"</font> |
_dir="$(ensure mktemp -d)" | |
local _file="${_dir}/rustup-init${_ext}" | |
| |
local _ansi_escapes_are_valid=false | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _dir</font> |
if [ -t 2 ]; then | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> _dir</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">(</font><font color="#FFFFFF">ensure</font><font color="#E6DB74"> mktemp</font><font color="#FD971F"> -d</font><font color="#E6DB74">)</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
if [ "${TERM+set}" = 'set' ]; then | <font color="#FFFFFF"> </font><font color="#7C7865"># Because the previous command ran in a subshell, we must manually</font> |
case "$TERM" in | <font color="#FFFFFF"> </font><font color="#7C7865"># propagate exit status.</font> |
xterm*|rxvt*|urxvt*|linux*|vt*) | <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 1</font> |
_ansi_escapes_are_valid=true | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
;; | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _file</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_dir</font><font color="#E6DB74">}/rustup-init</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ext</font><font color="#E6DB74">}</font><font color="#FFFFFF">"</font> |
esac | |
fi | |
fi | |
| |
# check if we have to use /dev/tty to prompt the user | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _ansi_escapes_are_valid</font><font color="#F92672">=</font><font color="#E6DB74">false</font> |
local need_tty=yes | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-t</font><font color="#FFFFFF"> 2 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
for arg in "$@"; do | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">TERM</font><font color="#F92672">+</font><font color="#E6DB74">set}</font><font color="#FFFFFF">" </font><font color="#F92672">=</font><font color="#FFFFFF"> '</font><font color="#E6DB74">set</font><font color="#FFFFFF">' </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
case "$arg" in | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$TERM" </font><font color="#F92672">in</font> |
-h|--help) | <font color="#FFFFFF"> xterm</font><font color="#F92672">*|</font><font color="#FFFFFF">rxvt</font><font color="#F92672">*|</font><font color="#FFFFFF">urxvt</font><font color="#F92672">*|</font><font color="#FFFFFF">linux</font><font color="#F92672">*|</font><font color="#FFFFFF">vt</font><font color="#F92672">*)</font> |
usage | <font color="#FFFFFF"> _ansi_escapes_are_valid</font><font color="#F92672">=</font><font color="#E6DB74">true</font> |
exit 0 | <font color="#FFFFFF"> ;;</font> |
;; | <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
-y) | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
# user wants to skip the prompt -- we don't need /dev/tty | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
need_tty=no | |
;; | |
*) | |
;; | |
esac | |
done | |
| |
if $_ansi_escapes_are_valid; then | <font color="#FFFFFF"> </font><font color="#7C7865"># check if we have to use /dev/tty to prompt the user</font> |
printf "\33[1minfo:\33[0m downloading installer\n" 1>&2 | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> need_tty</font><font color="#F92672">=</font><font color="#E6DB74">yes</font> |
else | <font color="#FFFFFF"> </font><font color="#F92672">for</font><font color="#FFFFFF"> arg </font><font color="#F92672">in</font><font color="#FFFFFF"> "$@"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">do</font> |
printf '%s\n' 'info: downloading installer' 1>&2 | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$arg" </font><font color="#F92672">in</font> |
fi | <font color="#FFFFFF"> --help</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> usage</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 0</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> OPTIND</font><font color="#F92672">=</font><font color="#E6DB74">1</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">arg</font><font color="#F92672">%%</font><font color="#E6DB74">--</font><font color="#F92672">*</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#F92672">=</font><font color="#FFFFFF"> "" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Long option (other than --help);</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># don't attempt to interpret it.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">continue</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">while</font><font color="#FFFFFF"> </font><font color="#66D9EF">getopts</font><font color="#FFFFFF"> :hy sub_arg "$arg"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">do</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$sub_arg" </font><font color="#F92672">in</font> |
| <font color="#FFFFFF"> h</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> usage</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 0</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> y</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># user wants to skip the prompt --</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># we don't need /dev/tty</font> |
| <font color="#FFFFFF"> need_tty</font><font color="#F92672">=</font><font color="#E6DB74">no</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">done</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">done</font> |
| |
ensure mkdir -p "$_dir" | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> $_ansi_escapes_are_valid</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
ensure downloader "$_url" "$_file" "$_arch" | <font color="#FFFFFF"> </font><font color="#66D9EF">printf</font><font color="#FFFFFF"> "</font><font color="#E6DB74">\33[1minfo:\33[0m downloading installer\n</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
ensure chmod u+x "$_file" | <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
if [ ! -x "$_file" ]; then | <font color="#FFFFFF"> </font><font color="#66D9EF">printf</font><font color="#FFFFFF"> '</font><font color="#E6DB74">%s\n</font><font color="#FFFFFF">' '</font><font color="#E6DB74">info: downloading installer</font><font color="#FFFFFF">' </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
printf '%s\n' "Cannot execute $_file (likely because of mounting /tmp as noexec)." 1>&2 | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
printf '%s\n' "Please copy the file to a location where you can execute binaries and run ./rustup-init${_ext}." 1>&2 | |
exit 1 | |
fi | |
| |
if [ "$need_tty" = "yes" ]; then | <font color="#FFFFFF"> ensure mkdir</font><font color="#FD971F"> -p</font><font color="#FFFFFF"> "$_dir"</font> |
# The installer is going to want to ask for confirmation by | <font color="#FFFFFF"> ensure downloader "$_url" "$_file" "$_arch"</font> |
# reading stdin. This script was piped into `sh` though and | <font color="#FFFFFF"> ensure chmod u+x "$_file"</font> |
# doesn't have stdin to pass to its children. Instead we're going | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> </font><font color="#FD971F">-x</font><font color="#FFFFFF"> "$_file" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
# to explicitly connect /dev/tty to the installer's stdin. | <font color="#FFFFFF"> </font><font color="#66D9EF">printf</font><font color="#FFFFFF"> '</font><font color="#E6DB74">%s\n</font><font color="#FFFFFF">' "</font><font color="#E6DB74">Cannot execute </font><font color="#FFFFFF">$_file</font><font color="#E6DB74"> (likely because of mounting /tmp as noexec).</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
if [ ! -t 1 ]; then | <font color="#FFFFFF"> </font><font color="#66D9EF">printf</font><font color="#FFFFFF"> '</font><font color="#E6DB74">%s\n</font><font color="#FFFFFF">' "</font><font color="#E6DB74">Please copy the file to a location where you can execute binaries and run ./rustup-init</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ext</font><font color="#E6DB74">}.</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
err "Unable to run interactively. Run with -y to accept defaults, --help for additional options" | <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 1</font> |
fi | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
ignore "$_file" "$@" < /dev/tty | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$need_tty" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">yes</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#FFFFFF"> </font><font color="#F92672">&&</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> </font><font color="#FD971F">-t</font><font color="#FFFFFF"> 0 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
else | <font color="#FFFFFF"> </font><font color="#7C7865"># The installer is going to want to ask for confirmation by</font> |
ignore "$_file" "$@" | <font color="#FFFFFF"> </font><font color="#7C7865"># reading stdin. This script was piped into `sh` though and</font> |
fi | <font color="#FFFFFF"> </font><font color="#7C7865"># doesn't have stdin to pass to its children. Instead we're going</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># to explicitly connect /dev/tty to the installer's stdin.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> </font><font color="#FD971F">-t</font><font color="#FFFFFF"> 1 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">Unable to run interactively. Run with -y to accept defaults, --help for additional options</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
local _retval=$? | <font color="#FFFFFF"> ignore "$_file" "$@" </font><font color="#F92672"><</font><font color="#FFFFFF"> /dev/tty</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> ignore "$_file" "$@"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
ignore rm "$_file" | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _retval</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
ignore rmdir "$_dir" | |
| |
return "$_retval" | <font color="#FFFFFF"> ignore rm "$_file"</font> |
} | <font color="#FFFFFF"> ignore rmdir "$_dir"</font> |
| |
check_proc() { | <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> "$_retval"</font> |
# Check for /proc by looking for the /proc/self/exe link | <font color="#FFFFFF">}</font> |
# This is only run on Linux | |
if ! test -L /proc/self/exe ; then | |
err "fatal: Unable to find /proc/self/exe. Is /proc mounted? Installation cannot proceed without /proc." | |
fi | |
} | |
| |
get_bitness() { | <font color="#A6E22E">check_proc</font><font color="#FFFFFF">() {</font> |
need_cmd head | <font color="#FFFFFF"> </font><font color="#7C7865"># Check for /proc by looking for the /proc/self/exe link</font> |
# Architecture detection without dependencies beyond coreutils. | <font color="#FFFFFF"> </font><font color="#7C7865"># This is only run on Linux</font> |
# ELF files start out "\x7fELF", and the following byte is | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> test</font><font color="#FD971F"> -L</font><font color="#FFFFFF"> /proc/self/exe </font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
# 0x01 for 32-bit and | <font color="#FFFFFF"> err "</font><font color="#E6DB74">fatal: Unable to find /proc/self/exe. Is /proc mounted? Installation cannot proceed without /proc.</font><font color="#FFFFFF">"</font> |
# 0x02 for 64-bit. | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
# The printf builtin on some shells like dash only supports octal | <font color="#FFFFFF">}</font> |
# escape sequences, so we use those. | |
local _current_exe_head | |
_current_exe_head=$(head -c 5 /proc/self/exe ) | |
if [ "$_current_exe_head" = "$(printf '\177ELF\001')" ]; then | |
echo 32 | |
elif [ "$_current_exe_head" = "$(printf '\177ELF\002')" ]; then | |
echo 64 | |
else | |
err "unknown platform bitness" | |
fi | |
} | |
| |
is_host_amd64_elf() { | <font color="#A6E22E">get_bitness</font><font color="#FFFFFF">() {</font> |
need_cmd head | <font color="#FFFFFF"> need_cmd head</font> |
need_cmd tail | <font color="#FFFFFF"> </font><font color="#7C7865"># Architecture detection without dependencies beyond coreutils.</font> |
# ELF e_machine detection without dependencies beyond coreutils. | <font color="#FFFFFF"> </font><font color="#7C7865"># ELF files start out "\x7fELF", and the following byte is</font> |
# Two-byte field at offset 0x12 indicates the CPU, | <font color="#FFFFFF"> </font><font color="#7C7865"># 0x01 for 32-bit and</font> |
# but we're interested in it being 0x3E to indicate amd64, or not that. | <font color="#FFFFFF"> </font><font color="#7C7865"># 0x02 for 64-bit.</font> |
local _current_exe_machine | <font color="#FFFFFF"> </font><font color="#7C7865"># The printf builtin on some shells like dash only supports octal</font> |
_current_exe_machine=$(head -c 19 /proc/self/exe | tail -c 1) | <font color="#FFFFFF"> </font><font color="#7C7865"># escape sequences, so we use those.</font> |
[ "$_current_exe_machine" = "$(printf '\076')" ] | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _current_exe_head</font> |
} | <font color="#FFFFFF"> _current_exe_head</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">head</font><font color="#FD971F"> -c</font><font color="#E6DB74"> 5 /proc/self/exe )</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_current_exe_head" </font><font color="#F92672">=</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#66D9EF">printf</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">\177ELF\001</font><font color="#FFFFFF">'</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> 32</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_current_exe_head" </font><font color="#F92672">=</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#66D9EF">printf</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">\177ELF\002</font><font color="#FFFFFF">'</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> 64</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">unknown platform bitness</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF">}</font> |
| |
get_endianness() { | <font color="#A6E22E">is_host_amd64_elf</font><font color="#FFFFFF">() {</font> |
local cputype=$1 | <font color="#FFFFFF"> need_cmd head</font> |
local suffix_eb=$2 | <font color="#FFFFFF"> need_cmd tail</font> |
local suffix_el=$3 | <font color="#FFFFFF"> </font><font color="#7C7865"># ELF e_machine detection without dependencies beyond coreutils.</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Two-byte field at offset 0x12 indicates the CPU,</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># but we're interested in it being 0x3E to indicate amd64, or not that.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _current_exe_machine</font> |
| <font color="#FFFFFF"> _current_exe_machine</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">head</font><font color="#FD971F"> -c</font><font color="#E6DB74"> 19 /proc/self/exe </font><font color="#F92672">|</font><font color="#E6DB74"> </font><font color="#FFFFFF">tail</font><font color="#FD971F"> -c</font><font color="#E6DB74"> 1)</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_current_exe_machine" </font><font color="#F92672">=</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#66D9EF">printf</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">\076</font><font color="#FFFFFF">'</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font> |
| <font color="#FFFFFF">}</font> |
| |
# detect endianness without od/hexdump, like get_bitness() does. | <font color="#A6E22E">get_endianness</font><font color="#FFFFFF">() {</font> |
need_cmd head | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> cputype</font><font color="#F92672">=</font><font color="#FFFFFF">$1</font> |
need_cmd tail | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> suffix_eb</font><font color="#F92672">=</font><font color="#FFFFFF">$2</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> suffix_el</font><font color="#F92672">=</font><font color="#FFFFFF">$3</font> |
| |
local _current_exe_endianness | <font color="#FFFFFF"> </font><font color="#7C7865"># detect endianness without od/hexdump, like get_bitness() does.</font> |
_current_exe_endianness="$(head -c 6 /proc/self/exe | tail -c 1)" | <font color="#FFFFFF"> need_cmd head</font> |
if [ "$_current_exe_endianness" = "$(printf '\001')" ]; then | <font color="#FFFFFF"> need_cmd tail</font> |
echo "${cputype}${suffix_el}" | |
elif [ "$_current_exe_endianness" = "$(printf '\002')" ]; then | |
echo "${cputype}${suffix_eb}" | |
else | |
err "unknown platform endianness" | |
fi | |
} | |
| |
get_architecture() { | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _current_exe_endianness</font> |
local _ostype _cputype _bitness _arch _clibtype | <font color="#FFFFFF"> _current_exe_endianness</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">(</font><font color="#FFFFFF">head</font><font color="#FD971F"> -c</font><font color="#E6DB74"> 6 /proc/self/exe </font><font color="#F92672">|</font><font color="#E6DB74"> </font><font color="#FFFFFF">tail</font><font color="#FD971F"> -c</font><font color="#E6DB74"> 1)</font><font color="#FFFFFF">"</font> |
_ostype="$(uname -s)" | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_current_exe_endianness" </font><font color="#F92672">=</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#66D9EF">printf</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">\001</font><font color="#FFFFFF">'</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
_cputype="$(uname -m)" | <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">cputype</font><font color="#E6DB74">}</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">suffix_el</font><font color="#E6DB74">}</font><font color="#FFFFFF">"</font> |
_clibtype="gnu" | <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_current_exe_endianness" </font><font color="#F92672">=</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#66D9EF">printf</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">\002</font><font color="#FFFFFF">'</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">cputype</font><font color="#E6DB74">}</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">suffix_eb</font><font color="#E6DB74">}</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">unknown platform endianness</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF">}</font> |
| |
if [ "$_ostype" = Linux ]; then | <font color="#7C7865"># Detect the Linux/LoongArch UAPI flavor, with all errors being non-fatal.</font> |
if [ "$(uname -o)" = Android ]; then | <font color="#7C7865"># Returns 0 or 234 in case of successful detection, 1 otherwise (/tmp being</font> |
_ostype=Android | <font color="#7C7865"># noexec, or other causes).</font> |
fi | <font color="#A6E22E">check_loongarch_uapi</font><font color="#FFFFFF">() {</font> |
if ldd --version 2>&1 | grep -q 'musl'; then | <font color="#FFFFFF"> need_cmd base64</font> |
_clibtype="musl" | |
fi | |
fi | |
| |
if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ]; then | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _tmp</font> |
# Darwin `uname -m` lies | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> _tmp</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">(</font><font color="#FFFFFF">ensure</font><font color="#E6DB74"> mktemp)</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
if sysctl hw.optional.x86_64 | grep -q ': 1'; then | <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> 1</font> |
_cputype=x86_64 | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
fi | |
fi | |
| |
if [ "$_ostype" = SunOS ]; then | <font color="#FFFFFF"> </font><font color="#7C7865"># Minimal Linux/LoongArch UAPI detection, exiting with 0 in case of</font> |
# Both Solaris and illumos presently announce as "SunOS" in "uname -s" | <font color="#FFFFFF"> </font><font color="#7C7865"># upstream ("new world") UAPI, and 234 (-EINVAL truncated) in case of</font> |
# so use "uname -o" to disambiguate. We use the full path to the | <font color="#FFFFFF"> </font><font color="#7C7865"># old-world (as deployed on several early commercial Linux distributions</font> |
# system uname in case the user has coreutils uname first in PATH, | <font color="#FFFFFF"> </font><font color="#7C7865"># for LoongArch).</font> |
# which has historically sometimes printed the wrong value here. | <font color="#FFFFFF"> </font><font color="#7C7865">#</font> |
if [ "$(/usr/bin/uname -o)" = illumos ]; then | <font color="#FFFFFF"> </font><font color="#7C7865"># See https://gist.github.com/xen0n/5ee04aaa6cecc5c7794b9a0c3b65fc7f for</font> |
_ostype=illumos | <font color="#FFFFFF"> </font><font color="#7C7865"># source to this helper binary.</font> |
fi | <font color="#FFFFFF"> ignore base64</font><font color="#FD971F"> -d</font><font color="#FFFFFF"> </font><font color="#F92672">></font><font color="#FFFFFF"> "$_tmp" </font><font color="#F92672"><<EOF</font> |
| <font color="#E6DB74">f0VMRgIBAQAAAAAAAAAAAAIAAgEBAAAAeAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAQQAAAEAAOAAB</font> |
| <font color="#E6DB74">AAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAJAAAAAAAAAAkAAAAAAAAAAAA</font> |
| <font color="#E6DB74">AQAAAAAABCiAAwUAFQAGABUAByCAAwsYggMAACsAC3iBAwAAKwAxen0n</font> |
| <font color="#F92672">EOF</font> |
| |
# illumos systems have multi-arch userlands, and "uname -m" reports the | <font color="#FFFFFF"> ignore chmod u+x "$_tmp"</font> |
# machine hardware name; e.g., "i86pc" on both 32- and 64-bit x86 | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> </font><font color="#FD971F">-x</font><font color="#FFFFFF"> "$_tmp" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
# systems. Check for the native (widest) instruction set on the | <font color="#FFFFFF"> ignore rm "$_tmp"</font> |
# running kernel: | <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> 1</font> |
if [ "$_cputype" = i86pc ]; then | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
_cputype="$(isainfo -n)" | |
fi | |
fi | |
| |
case "$_ostype" in | <font color="#FFFFFF"> "$_tmp"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _retval</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| |
Android) | <font color="#FFFFFF"> ignore rm "$_tmp"</font> |
_ostype=linux-android | <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> "$_retval"</font> |
;; | <font color="#FFFFFF">}</font> |
| |
Linux) | <font color="#A6E22E">ensure_loongarch_uapi</font><font color="#FFFFFF">() {</font> |
check_proc | <font color="#FFFFFF"> check_loongarch_uapi</font> |
_ostype=unknown-linux-$_clibtype | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> $? </font><font color="#F92672">in</font> |
_bitness=$(get_bitness) | <font color="#FFFFFF"> 0</font><font color="#F92672">)</font> |
;; | <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> 0</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> 234</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> '</font><font color="#E6DB74">Your Linux kernel does not provide the ABI required by this Rust</font><font color="#FFFFFF">' </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> '</font><font color="#E6DB74">distribution. Please check with your OS provider for how to obtain a</font><font color="#FFFFFF">' </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> '</font><font color="#E6DB74">compatible Rust package for your system.</font><font color="#FFFFFF">' </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 1</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Cannot determine current system's ABI flavor, continuing anyway.</font><font color="#FFFFFF">" </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> '</font><font color="#E6DB74">Note that the official Rust distribution only works with the upstream</font><font color="#FFFFFF">' </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> '</font><font color="#E6DB74">kernel ABI. Installation will fail if your running kernel happens to be</font><font color="#FFFFFF">' </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> '</font><font color="#E6DB74">incompatible.</font><font color="#FFFFFF">' </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
| <font color="#FFFFFF">}</font> |
| |
FreeBSD) | <font color="#A6E22E">get_architecture</font><font color="#FFFFFF">() {</font> |
_ostype=unknown-freebsd | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _ostype _cputype _bitness _arch _clibtype</font> |
;; | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">(</font><font color="#FFFFFF">uname</font><font color="#FD971F"> -s</font><font color="#E6DB74">)</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">(</font><font color="#FFFFFF">uname</font><font color="#FD971F"> -m</font><font color="#E6DB74">)</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> _clibtype</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">gnu</font><font color="#FFFFFF">"</font> |
| |
NetBSD) | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> Linux </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
_ostype=unknown-netbsd | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#FFFFFF">uname</font><font color="#FD971F"> -o</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#F92672">=</font><font color="#FFFFFF"> Android </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
;; | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">Android</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> ldd</font><font color="#FD971F"> --version</font><font color="#FFFFFF"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74">musl</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _clibtype</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">musl</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
DragonFly) | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> Darwin </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
_ostype=unknown-dragonfly | <font color="#FFFFFF"> </font><font color="#7C7865"># Darwin `uname -m` can lie due to Rosetta shenanigans. If you manage to</font> |
;; | <font color="#FFFFFF"> </font><font color="#7C7865"># invoke a native shell binary and then a native uname binary, you can</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># get the real answer, but that's hard to ensure, so instead we use</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># `sysctl` (which doesn't lie) to check for the actual architecture.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_cputype" </font><font color="#F92672">=</font><font color="#FFFFFF"> i386 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Handling i386 compatibility mode in older macOS versions (<10.15)</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># running on x86_64-based Macs.</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Starting from 10.15, macOS explicitly bans all i386 binaries from running.</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># See: <https://support.apple.com/en-us/HT208436></font> |
| |
Darwin) | <font color="#FFFFFF"> </font><font color="#7C7865"># Avoid `sysctl: unknown oid` stderr output and/or non-zero exit code.</font> |
_ostype=apple-darwin | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> sysctl hw.optional.x86_64 </font><font color="#BE84FF">2</font><font color="#F92672">></font><font color="#FFFFFF"> /dev/null </font><font color="#F92672">||</font><font color="#FFFFFF"> true </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74">: 1</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
;; | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">x86_64</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_cputype" </font><font color="#F92672">=</font><font color="#FFFFFF"> x86_64 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Handling x86-64 compatibility mode (a.k.a. Rosetta 2)</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># in newer macOS versions (>=11) running on arm64-based Macs.</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Rosetta 2 is built exclusively for x86-64 and cannot run i386 binaries.</font> |
| |
illumos) | <font color="#FFFFFF"> </font><font color="#7C7865"># Avoid `sysctl: unknown oid` stderr output and/or non-zero exit code.</font> |
_ostype=unknown-illumos | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> sysctl hw.optional.arm64 </font><font color="#BE84FF">2</font><font color="#F92672">></font><font color="#FFFFFF"> /dev/null </font><font color="#F92672">||</font><font color="#FFFFFF"> true </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74">: 1</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
;; | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">arm64</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
MINGW* | MSYS* | CYGWIN*) | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> SunOS </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
_ostype=pc-windows-gnu | <font color="#FFFFFF"> </font><font color="#7C7865"># Both Solaris and illumos presently announce as "SunOS" in "uname -s"</font> |
;; | <font color="#FFFFFF"> </font><font color="#7C7865"># so use "uname -o" to disambiguate. We use the full path to the</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># system uname in case the user has coreutils uname first in PATH,</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># which has historically sometimes printed the wrong value here.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#FFFFFF">/usr/bin/uname</font><font color="#FD971F"> -o</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#F92672">=</font><font color="#FFFFFF"> illumos </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">illumos</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
*) | <font color="#FFFFFF"> </font><font color="#7C7865"># illumos systems have multi-arch userlands, and "uname -m" reports the</font> |
err "unrecognized OS type: $_ostype" | <font color="#FFFFFF"> </font><font color="#7C7865"># machine hardware name; e.g., "i86pc" on both 32- and 64-bit x86</font> |
;; | <font color="#FFFFFF"> </font><font color="#7C7865"># systems. Check for the native (widest) instruction set on the</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># running kernel:</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_cputype" </font><font color="#F92672">=</font><font color="#FFFFFF"> i86pc </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">(</font><font color="#FFFFFF">isainfo</font><font color="#FD971F"> -n</font><font color="#E6DB74">)</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
esac | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">in</font> |
| |
case "$_cputype" in | <font color="#FFFFFF"> Android</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">linux-android</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
i386 | i486 | i686 | i786 | x86) | <font color="#FFFFFF"> Linux</font><font color="#F92672">)</font> |
_cputype=i686 | <font color="#FFFFFF"> check_proc</font> |
;; | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">unknown-linux-</font><font color="#FFFFFF">$_clibtype</font> |
| <font color="#FFFFFF"> _bitness</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_bitness</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
xscale | arm) | <font color="#FFFFFF"> FreeBSD</font><font color="#F92672">)</font> |
_cputype=arm | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">unknown-freebsd</font> |
if [ "$_ostype" = "linux-android" ]; then | <font color="#FFFFFF"> ;;</font> |
_ostype=linux-androideabi | |
fi | |
;; | |
| |
armv6l) | <font color="#FFFFFF"> NetBSD</font><font color="#F92672">)</font> |
_cputype=arm | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">unknown-netbsd</font> |
if [ "$_ostype" = "linux-android" ]; then | <font color="#FFFFFF"> ;;</font> |
_ostype=linux-androideabi | |
else | |
_ostype="${_ostype}eabihf" | |
fi | |
;; | |
| |
armv7l | armv8l) | <font color="#FFFFFF"> DragonFly</font><font color="#F92672">)</font> |
_cputype=armv7 | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">unknown-dragonfly</font> |
if [ "$_ostype" = "linux-android" ]; then | <font color="#FFFFFF"> ;;</font> |
_ostype=linux-androideabi | |
else | |
_ostype="${_ostype}eabihf" | |
fi | |
;; | |
| |
aarch64 | arm64) | <font color="#FFFFFF"> Darwin</font><font color="#F92672">)</font> |
_cputype=aarch64 | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">apple-darwin</font> |
;; | <font color="#FFFFFF"> ;;</font> |
| |
x86_64 | x86-64 | x64 | amd64) | <font color="#FFFFFF"> illumos</font><font color="#F92672">)</font> |
_cputype=x86_64 | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">unknown-illumos</font> |
;; | <font color="#FFFFFF"> ;;</font> |
| |
mips) | <font color="#FFFFFF"> MINGW</font><font color="#F92672">*</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> MSYS</font><font color="#F92672">*</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> CYGWIN</font><font color="#F92672">*</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> Windows_NT</font><font color="#F92672">)</font> |
_cputype=$(get_endianness mips '' el) | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">pc-windows-gnu</font> |
;; | <font color="#FFFFFF"> ;;</font> |
| |
mips64) | <font color="#FFFFFF"> </font><font color="#F92672">*)</font> |
if [ "$_bitness" -eq 64 ]; then | <font color="#FFFFFF"> err "</font><font color="#E6DB74">unrecognized OS type: </font><font color="#FFFFFF">$_ostype"</font> |
# only n64 ABI is supported for now | <font color="#FFFFFF"> ;;</font> |
_ostype="${_ostype}abi64" | |
_cputype=$(get_endianness mips64 '' el) | |
fi | |
;; | |
| |
ppc) | <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
_cputype=powerpc | |
;; | |
| |
ppc64) | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$_cputype" </font><font color="#F92672">in</font> |
_cputype=powerpc64 | |
;; | |
| |
ppc64le) | <font color="#FFFFFF"> i386 </font><font color="#F92672">|</font><font color="#FFFFFF"> i486 </font><font color="#F92672">|</font><font color="#FFFFFF"> i686 </font><font color="#F92672">|</font><font color="#FFFFFF"> i786 </font><font color="#F92672">|</font><font color="#FFFFFF"> x86</font><font color="#F92672">)</font> |
_cputype=powerpc64le | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">i686</font> |
;; | <font color="#FFFFFF"> ;;</font> |
| |
s390x) | <font color="#FFFFFF"> xscale </font><font color="#F92672">|</font><font color="#FFFFFF"> arm</font><font color="#F92672">)</font> |
_cputype=s390x | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">arm</font> |
;; | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">linux-android</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
riscv64) | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">linux-androideabi</font> |
_cputype=riscv64gc | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
;; | <font color="#FFFFFF"> ;;</font> |
*) | |
err "unknown CPU type: $_cputype" | |
| |
esac | <font color="#FFFFFF"> armv6l</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">arm</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">linux-android</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">linux-androideabi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ostype</font><font color="#E6DB74">}eabihf</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
# Detect 64-bit linux with 32-bit userland | <font color="#FFFFFF"> armv7l </font><font color="#F92672">|</font><font color="#FFFFFF"> armv8l</font><font color="#F92672">)</font> |
if [ "${_ostype}" = unknown-linux-gnu ] && [ "${_bitness}" -eq 32 ]; then | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">armv7</font> |
case $_cputype in | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">linux-android</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
x86_64) | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">linux-androideabi</font> |
if [ -n "${RUSTUP_CPUTYPE:-}" ]; then | <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
_cputype="$RUSTUP_CPUTYPE" | <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ostype</font><font color="#E6DB74">}eabihf</font><font color="#FFFFFF">"</font> |
else { | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
# 32-bit executable for amd64 = x32 | <font color="#FFFFFF"> ;;</font> |
if is_host_amd64_elf; then { | |
echo "This host is running an x32 userland; as it stands, x32 support is poor," 1>&2 | |
echo "and there isn't a native toolchain -- you will have to install" 1>&2 | |
echo "multiarch compatibility with i686 and/or amd64, then select one" 1>&2 | |
echo "by re-running this script with the RUSTUP_CPUTYPE environment variable" 1>&2 | |
echo "set to i686 or x86_64, respectively." 1>&2 | |
echo 1>&2 | |
echo "You will be able to add an x32 target after installation by running" 1>&2 | |
echo " rustup target add x86_64-unknown-linux-gnux32" 1>&2 | |
exit 1 | |
}; else | |
_cputype=i686 | |
fi | |
}; fi | |
;; | |
mips64) | |
_cputype=$(get_endianness mips '' el) | |
;; | |
powerpc64) | |
_cputype=powerpc | |
;; | |
aarch64) | |
_cputype=armv7 | |
if [ "$_ostype" = "linux-android" ]; then | |
_ostype=linux-androideabi | |
else | |
_ostype="${_ostype}eabihf" | |
fi | |
;; | |
riscv64gc) | |
err "riscv64 with 32-bit userland unsupported" | |
;; | |
esac | |
fi | |
| |
# Detect armv7 but without the CPU features Rust needs in that build, | <font color="#FFFFFF"> aarch64 </font><font color="#F92672">|</font><font color="#FFFFFF"> arm64</font><font color="#F92672">)</font> |
# and fall back to arm. | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">aarch64</font> |
# See https://github.com/rust-lang/rustup.rs/issues/587. | <font color="#FFFFFF"> ;;</font> |
if [ "$_ostype" = "unknown-linux-gnueabihf" ] && [ "$_cputype" = armv7 ]; then | |
if ensure grep '^Features' /proc/cpuinfo | grep -q -v neon; then | |
# At least one processor does not have NEON. | |
_cputype=arm | |
fi | |
fi | |
| |
_arch="${_cputype}-${_ostype}" | <font color="#FFFFFF"> x86_64 </font><font color="#F92672">|</font><font color="#FFFFFF"> x86-64 </font><font color="#F92672">|</font><font color="#FFFFFF"> x64 </font><font color="#F92672">|</font><font color="#FFFFFF"> amd64</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">x86_64</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
RETVAL="$_arch" | <font color="#FFFFFF"> mips</font><font color="#F92672">)</font> |
} | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_endianness</font><font color="#E6DB74"> mips </font><font color="#FFFFFF">''</font><font color="#E6DB74"> el)</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
say() { | <font color="#FFFFFF"> mips64</font><font color="#F92672">)</font> |
printf 'rustup: %s\n' "$1" | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_bitness" </font><font color="#FD971F">-eq</font><font color="#FFFFFF"> 64 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
} | <font color="#FFFFFF"> </font><font color="#7C7865"># only n64 ABI is supported for now</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ostype</font><font color="#E6DB74">}abi64</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_endianness</font><font color="#E6DB74"> mips64 </font><font color="#FFFFFF">''</font><font color="#E6DB74"> el)</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
err() { | <font color="#FFFFFF"> ppc</font><font color="#F92672">)</font> |
say "$1" >&2 | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">powerpc</font> |
exit 1 | <font color="#FFFFFF"> ;;</font> |
} | |
| |
need_cmd() { | <font color="#FFFFFF"> ppc64</font><font color="#F92672">)</font> |
if ! check_cmd "$1"; then | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">powerpc64</font> |
err "need '$1' (command not found)" | <font color="#FFFFFF"> ;;</font> |
fi | |
} | |
| |
check_cmd() { | <font color="#FFFFFF"> ppc64le</font><font color="#F92672">)</font> |
command -v "$1" > /dev/null 2>&1 | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">powerpc64le</font> |
} | <font color="#FFFFFF"> ;;</font> |
| |
assert_nz() { | <font color="#FFFFFF"> s390x</font><font color="#F92672">)</font> |
if [ -z "$1" ]; then err "assert_nz $2"; fi | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">s390x</font> |
} | <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> riscv64</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">riscv64gc</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> loongarch64</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">loongarch64</font> |
| <font color="#FFFFFF"> ensure_loongarch_uapi</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">unknown CPU type: </font><font color="#FFFFFF">$_cputype"</font> |
| |
# Run a command that should never fail. If the command fails execution | <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
# will immediately terminate with an error showing the failing | |
# command. | |
ensure() { | |
if ! "$@"; then err "command failed: $*"; fi | |
} | |
| |
# This is just for indicating that commands' results are being | <font color="#FFFFFF"> </font><font color="#7C7865"># Detect 64-bit linux with 32-bit userland</font> |
# intentionally ignored. Usually, because it's being executed | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ostype</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#F92672">=</font><font color="#FFFFFF"> unknown-linux-gnu </font><font color="#66D9EF">]</font><font color="#FFFFFF"> </font><font color="#F92672">&&</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_bitness</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#FD971F">-eq</font><font color="#FFFFFF"> 32 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
# as part of error handling. | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> $_cputype </font><font color="#F92672">in</font> |
ignore() { | <font color="#FFFFFF"> x86_64</font><font color="#F92672">)</font> |
"$@" | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">RUSTUP_CPUTYPE</font><font color="#F92672">:-</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
} | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#FFFFFF">"$RUSTUP_CPUTYPE"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font><font color="#FFFFFF"> {</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># 32-bit executable for amd64 = x32</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> is_host_amd64_elf</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font><font color="#FFFFFF"> {</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">This host is running an x32 userland; as it stands, x32 support is poor,</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">and there isn't a native toolchain -- you will have to install</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">multiarch compatibility with i686 and/or amd64, then select one</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">by re-running this script with the RUSTUP_CPUTYPE environment variable</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">set to i686 or x86_64, respectively.</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">You will be able to add an x32 target after installation by running</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74"> rustup target add x86_64-unknown-linux-gnux32</font><font color="#FFFFFF">" </font><font color="#BE84FF">1</font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 1</font> |
| <font color="#FFFFFF"> }</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">i686</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> }</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> mips64</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_endianness</font><font color="#E6DB74"> mips </font><font color="#FFFFFF">''</font><font color="#E6DB74"> el)</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> powerpc64</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">powerpc</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> aarch64</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">armv7</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">linux-android</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#E6DB74">linux-androideabi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _ostype</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ostype</font><font color="#E6DB74">}eabihf</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> riscv64gc</font><font color="#F92672">)</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">riscv64 with 32-bit userland unsupported</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
# This wraps curl or wget. Try curl first, if not installed, | <font color="#FFFFFF"> </font><font color="#7C7865"># Detect armv7 but without the CPU features Rust needs in that build,</font> |
# use wget instead. | <font color="#FFFFFF"> </font><font color="#7C7865"># and fall back to arm.</font> |
downloader() { | <font color="#FFFFFF"> </font><font color="#7C7865"># See https://github.com/rust-lang/rustup.rs/issues/587.</font> |
local _dld | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_ostype" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">unknown-linux-gnueabihf</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#FFFFFF"> </font><font color="#F92672">&&</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_cputype" </font><font color="#F92672">=</font><font color="#FFFFFF"> armv7 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
local _ciphersuites | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> ensure grep '</font><font color="#E6DB74">^Features</font><font color="#FFFFFF">' /proc/cpuinfo </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -E -q -v</font><font color="#FFFFFF"> '</font><font color="#E6DB74">neon|simd</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
local _err | <font color="#FFFFFF"> </font><font color="#7C7865"># At least one processor does not have NEON (which is asimd on armv8+).</font> |
local _status | <font color="#FFFFFF"> _cputype</font><font color="#F92672">=</font><font color="#E6DB74">arm</font> |
if check_cmd curl; then | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
_dld=curl | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
elif check_cmd wget; then | |
_dld=wget | |
else | |
_dld='curl or wget' # to be used in error message of need_cmd | |
fi | |
| |
if [ "$1" = --check ]; then | <font color="#FFFFFF"> _arch</font><font color="#F92672">=</font><font color="#FFFFFF">"$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_cputype</font><font color="#E6DB74">}-</font><font color="#FFFFFF">$</font><font color="#E6DB74">{</font><font color="#FFFFFF">_ostype</font><font color="#E6DB74">}</font><font color="#FFFFFF">"</font> |
need_cmd "$_dld" | |
elif [ "$_dld" = curl ]; then | |
get_ciphersuites_for_curl | |
_ciphersuites="$RETVAL" | |
if [ -n "$_ciphersuites" ]; then | |
_err=$(curl --proto '=https' --tlsv1.2 --ciphers "$_ciphersuites" --silent --show-error --fail --location "$1" --output "$2" 2>&1) | |
_status=$? | |
else | |
echo "Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure" | |
if ! check_help_for "$3" curl --proto --tlsv1.2; then | |
echo "Warning: Not enforcing TLS v1.2, this is potentially less secure" | |
_err=$(curl --silent --show-error --fail --location "$1" --output "$2" 2>&1) | |
_status=$? | |
else | |
_err=$(curl --proto '=https' --tlsv1.2 --silent --show-error --fail --location "$1" --output "$2" 2>&1) | |
_status=$? | |
fi | |
fi | |
if [ -n "$_err" ]; then | |
echo "$_err" >&2 | |
if echo "$_err" | grep -q 404$; then | |
err "installer for platform '$3' not found, this may be unsupported" | |
fi | |
fi | |
return $_status | |
elif [ "$_dld" = wget ]; then | |
get_ciphersuites_for_wget | |
_ciphersuites="$RETVAL" | |
if [ -n "$_ciphersuites" ]; then | |
_err=$(wget --https-only --secure-protocol=TLSv1_2 --ciphers "$_ciphersuites" "$1" -O "$2" 2>&1) | |
_status=$? | |
else | |
echo "Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure" | |
if ! check_help_for "$3" wget --https-only --secure-protocol; then | |
echo "Warning: Not enforcing TLS v1.2, this is potentially less secure" | |
_err=$(wget "$1" -O "$2" 2>&1) | |
_status=$? | |
else | |
_err=$(wget --https-only --secure-protocol=TLSv1_2 "$1" -O "$2" 2>&1) | |
_status=$? | |
fi | |
fi | |
if [ -n "$_err" ]; then | |
echo "$_err" >&2 | |
if echo "$_err" | grep -q ' 404 Not Found$'; then | |
err "installer for platform '$3' not found, this may be unsupported" | |
fi | |
fi | |
return $_status | |
else | |
err "Unknown downloader" # should not reach here | |
fi | |
} | |
| |
check_help_for() { | <font color="#FFFFFF"> RETVAL</font><font color="#F92672">=</font><font color="#FFFFFF">"$_arch"</font> |
local _arch | <font color="#FFFFFF">}</font> |
local _cmd | |
local _arg | |
_arch="$1" | |
shift | |
_cmd="$1" | |
shift | |
| |
local _category | <font color="#A6E22E">say</font><font color="#FFFFFF">() {</font> |
if "$_cmd" --help | grep -q 'For all options use the manual or "--help all".'; then | <font color="#FFFFFF"> </font><font color="#66D9EF">printf</font><font color="#FFFFFF"> '</font><font color="#E6DB74">rustup: %s\n</font><font color="#FFFFFF">' "$1"</font> |
_category="all" | <font color="#FFFFFF">}</font> |
else | |
_category="" | |
fi | |
| |
case "$_arch" in | <font color="#A6E22E">err</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> say "$1" </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 1</font> |
| <font color="#FFFFFF">}</font> |
| |
*darwin*) | <font color="#A6E22E">need_cmd</font><font color="#FFFFFF">() {</font> |
if check_cmd sw_vers; then | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> check_cmd "$1"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
case $(sw_vers -productVersion) in | <font color="#FFFFFF"> err "</font><font color="#E6DB74">need '</font><font color="#FFFFFF">$1</font><font color="#E6DB74">' (command not found)</font><font color="#FFFFFF">"</font> |
10.*) | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
# If we're running on macOS, older than 10.13, then we always | <font color="#FFFFFF">}</font> |
# fail to find these options to force fallback | |
if [ "$(sw_vers -productVersion | cut -d. -f2)" -lt 13 ]; then | |
# Older than 10.13 | |
echo "Warning: Detected macOS platform older than 10.13" | |
return 1 | |
fi | |
;; | |
11.*) | |
# We assume Big Sur will be OK for now | |
;; | |
*) | |
# Unknown product version, warn and continue | |
echo "Warning: Detected unknown macOS major version: $(sw_vers -productVersion)" | |
echo "Warning TLS capabilities detection may fail" | |
;; | |
esac | |
fi | |
;; | |
| |
esac | <font color="#A6E22E">check_cmd</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">command</font><font color="#FFFFFF"> </font><font color="#FD971F">-v</font><font color="#FFFFFF"> "$1" </font><font color="#F92672">></font><font color="#FFFFFF"> /dev/null </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font> |
| <font color="#FFFFFF">}</font> |
| |
for _arg in "$@"; do | <font color="#A6E22E">assert_nz</font><font color="#FFFFFF">() {</font> |
if ! "$_cmd" --help $_category | grep -q -- "$_arg"; then | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-z</font><font color="#FFFFFF"> "$1" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font><font color="#FFFFFF"> err "</font><font color="#E6DB74">assert_nz </font><font color="#FFFFFF">$2"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
return 1 | <font color="#FFFFFF">}</font> |
fi | |
done | |
| |
true # not strictly needed | <font color="#7C7865"># Run a command that should never fail. If the command fails execution</font> |
} | <font color="#7C7865"># will immediately terminate with an error showing the failing</font> |
| <font color="#7C7865"># command.</font> |
| <font color="#A6E22E">ensure</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> "$@"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font><font color="#FFFFFF"> err "</font><font color="#E6DB74">command failed: </font><font color="#FFFFFF">$*"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF">}</font> |
| |
# Return cipher suite string specified by user, otherwise return strong TLS 1.2-1.3 cipher suites | <font color="#7C7865"># This is just for indicating that commands' results are being</font> |
# if support by local tools is detected. Detection currently supports these curl backends: | <font color="#7C7865"># intentionally ignored. Usually, because it's being executed</font> |
# GnuTLS and OpenSSL (possibly also LibreSSL and BoringSSL). Return value can be empty. | <font color="#7C7865"># as part of error handling.</font> |
get_ciphersuites_for_curl() { | <font color="#A6E22E">ignore</font><font color="#FFFFFF">() {</font> |
if [ -n "${RUSTUP_TLS_CIPHERSUITES-}" ]; then | <font color="#FFFFFF"> "$@"</font> |
# user specified custom cipher suites, assume they know what they're doing | <font color="#FFFFFF">}</font> |
RETVAL="$RUSTUP_TLS_CIPHERSUITES" | |
return | |
fi | |
| |
local _openssl_syntax="no" | <font color="#7C7865"># This wraps curl or wget. Try curl first, if not installed,</font> |
local _gnutls_syntax="no" | <font color="#7C7865"># use wget instead.</font> |
local _backend_supported="yes" | <font color="#A6E22E">downloader</font><font color="#FFFFFF">() {</font> |
if curl -V | grep -q ' OpenSSL/'; then | <font color="#FFFFFF"> </font><font color="#7C7865"># zsh does not split words by default, Required for curl retry arguments below.</font> |
_openssl_syntax="yes" | <font color="#FFFFFF"> is_zsh </font><font color="#F92672">&&</font><font color="#FFFFFF"> setopt local_options shwordsplit</font> |
elif curl -V | grep -iq ' LibreSSL/'; then | |
_openssl_syntax="yes" | |
elif curl -V | grep -iq ' BoringSSL/'; then | |
_openssl_syntax="yes" | |
elif curl -V | grep -iq ' GnuTLS/'; then | |
_gnutls_syntax="yes" | |
else | |
_backend_supported="no" | |
fi | |
| |
local _args_supported="no" | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _dld</font> |
if [ "$_backend_supported" = "yes" ]; then | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _ciphersuites</font> |
# "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc. | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _err</font> |
if check_help_for "notspecified" "curl" "--tlsv1.2" "--ciphers" "--proto"; then | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _status</font> |
_args_supported="yes" | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _retry</font> |
fi | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_cmd curl</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
fi | <font color="#FFFFFF"> _dld</font><font color="#F92672">=</font><font color="#E6DB74">curl</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> check_cmd wget</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _dld</font><font color="#F92672">=</font><font color="#E6DB74">wget</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _dld</font><font color="#F92672">=</font><font color="#FFFFFF">'</font><font color="#E6DB74">curl or wget</font><font color="#FFFFFF">' </font><font color="#7C7865"># to be used in error message of need_cmd</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
local _cs="" | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$1" </font><font color="#F92672">=</font><font color="#FFFFFF"> --check </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
if [ "$_args_supported" = "yes" ]; then | <font color="#FFFFFF"> need_cmd "$_dld"</font> |
if [ "$_openssl_syntax" = "yes" ]; then | <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_dld" </font><font color="#F92672">=</font><font color="#FFFFFF"> curl </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
_cs=$(get_strong_ciphersuites_for "openssl") | <font color="#FFFFFF"> check_curl_for_retry_support</font> |
elif [ "$_gnutls_syntax" = "yes" ]; then | <font color="#FFFFFF"> _retry</font><font color="#F92672">=</font><font color="#FFFFFF">"$RETVAL"</font> |
_cs=$(get_strong_ciphersuites_for "gnutls") | <font color="#FFFFFF"> get_ciphersuites_for_curl</font> |
fi | <font color="#FFFFFF"> _ciphersuites</font><font color="#F92672">=</font><font color="#FFFFFF">"$RETVAL"</font> |
fi | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$_ciphersuites" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">curl</font><font color="#E6DB74"> </font><font color="#FFFFFF">$_retry</font><font color="#FD971F"> --proto</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">=https</font><font color="#FFFFFF">'</font><font color="#FD971F"> --tlsv1</font><font color="#E6DB74">.2</font><font color="#FD971F"> --ciphers</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$_ciphersuites"</font><font color="#FD971F"> --silent --show-error --fail --location</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> --output</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> check_help_for "$3" curl</font><font color="#FD971F"> --proto --tlsv1</font><font color="#FFFFFF">.2</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Not enforcing TLS v1.2, this is potentially less secure</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">curl</font><font color="#E6DB74"> </font><font color="#FFFFFF">$_retry</font><font color="#FD971F"> --silent --show-error --fail --location</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> --output</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">curl</font><font color="#E6DB74"> </font><font color="#FFFFFF">$_retry</font><font color="#FD971F"> --proto</font><font color="#E6DB74"> </font><font color="#FFFFFF">'</font><font color="#E6DB74">=https</font><font color="#FFFFFF">'</font><font color="#FD971F"> --tlsv1</font><font color="#E6DB74">.2</font><font color="#FD971F"> --silent --show-error --fail --location</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> --output</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$_err" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "$_err" </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "$_err" </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> 404$</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">installer for platform '</font><font color="#FFFFFF">$3</font><font color="#E6DB74">' not found, this may be unsupported</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> $_status</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_dld" </font><font color="#F92672">=</font><font color="#FFFFFF"> wget </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#FFFFFF">wget</font><font color="#FD971F"> -V</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#F92672">|</font><font color="#FFFFFF">head</font><font color="#FD971F"> -2</font><font color="#F92672">|</font><font color="#FFFFFF">tail</font><font color="#FD971F"> -1</font><font color="#F92672">|</font><font color="#FFFFFF">cut</font><font color="#FD971F"> -f1 -d</font><font color="#FFFFFF">"</font><font color="#E6DB74"> </font><font color="#FFFFFF">"</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">BusyBox</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: using the BusyBox version of wget. Not enforcing strong cipher suites for TLS or TLS v1.2, this is potentially less secure</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">wget</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> -O</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> get_ciphersuites_for_wget</font> |
| <font color="#FFFFFF"> _ciphersuites</font><font color="#F92672">=</font><font color="#FFFFFF">"$RETVAL"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$_ciphersuites" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">wget</font><font color="#FD971F"> --https-only --secure-protocol</font><font color="#F92672">=</font><font color="#E6DB74">TLSv1_2</font><font color="#FD971F"> --ciphers</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$_ciphersuites"</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> -O</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> check_help_for "$3" wget</font><font color="#FD971F"> --https-only --secure-protocol</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Not enforcing TLS v1.2, this is potentially less secure</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">wget</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> -O</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _err</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">wget</font><font color="#FD971F"> --https-only --secure-protocol</font><font color="#F92672">=</font><font color="#E6DB74">TLSv1_2 </font><font color="#FFFFFF">"$1"</font><font color="#FD971F"> -O</font><font color="#E6DB74"> </font><font color="#FFFFFF">"$2"</font><font color="#E6DB74"> </font><font color="#BE84FF">2</font><font color="#F92672">>&</font><font color="#BE84FF">1</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> _status</font><font color="#F92672">=</font><font color="#FFFFFF">$?</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$_err" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "$_err" </font><font color="#F92672">>&</font><font color="#BE84FF">2</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "$_err" </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74"> 404 Not Found$</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">installer for platform '</font><font color="#FFFFFF">$3</font><font color="#E6DB74">' not found, this may be unsupported</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> $_status</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> err "</font><font color="#E6DB74">Unknown downloader</font><font color="#FFFFFF">" </font><font color="#7C7865"># should not reach here</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF">}</font> |
| |
RETVAL="$_cs" | <font color="#A6E22E">check_help_for</font><font color="#FFFFFF">() {</font> |
} | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _arch</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _cmd</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _arg</font> |
| <font color="#FFFFFF"> _arch</font><font color="#F92672">=</font><font color="#FFFFFF">"$1"</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">shift</font> |
| <font color="#FFFFFF"> _cmd</font><font color="#F92672">=</font><font color="#FFFFFF">"$1"</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">shift</font> |
| |
# Return cipher suite string specified by user, otherwise return strong TLS 1.2-1.3 cipher suites | <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _category</font> |
# if support by local tools is detected. Detection currently supports these wget backends: | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> "$_cmd"</font><font color="#FD971F"> --help</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74">For all options use the manual or "--help all".</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
# GnuTLS and OpenSSL (possibly also LibreSSL and BoringSSL). Return value can be empty. | <font color="#FFFFFF"> _category</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">all</font><font color="#FFFFFF">"</font> |
get_ciphersuites_for_wget() { | <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
if [ -n "${RUSTUP_TLS_CIPHERSUITES-}" ]; then | <font color="#FFFFFF"> _category</font><font color="#F92672">=</font><font color="#FFFFFF">""</font> |
# user specified custom cipher suites, assume they know what they're doing | <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
RETVAL="$RUSTUP_TLS_CIPHERSUITES" | |
return | |
fi | |
| |
local _cs="" | <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> "$_arch" </font><font color="#F92672">in</font> |
if wget -V | grep -q '\-DHAVE_LIBSSL'; then | |
# "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc. | |
if check_help_for "notspecified" "wget" "TLSv1_2" "--ciphers" "--https-only" "--secure-protocol"; then | |
_cs=$(get_strong_ciphersuites_for "openssl") | |
fi | |
elif wget -V | grep -q '\-DHAVE_LIBGNUTLS'; then | |
# "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc. | |
if check_help_for "notspecified" "wget" "TLSv1_2" "--ciphers" "--https-only" "--secure-protocol"; then | |
_cs=$(get_strong_ciphersuites_for "gnutls") | |
fi | |
fi | |
| |
RETVAL="$_cs" | <font color="#FFFFFF"> </font><font color="#F92672">*</font><font color="#FFFFFF">darwin</font><font color="#F92672">*)</font> |
} | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_cmd sw_vers</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">case</font><font color="#FFFFFF"> $(sw_vers</font><font color="#FD971F"> -productVersion</font><font color="#FFFFFF">) </font><font color="#F92672">in</font> |
| <font color="#FFFFFF"> 10.</font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># If we're running on macOS, older than 10.13, then we always</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># fail to find these options to force fallback</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">(</font><font color="#FFFFFF">sw_vers</font><font color="#FD971F"> -productVersion</font><font color="#E6DB74"> </font><font color="#F92672">|</font><font color="#E6DB74"> </font><font color="#FFFFFF">cut</font><font color="#FD971F"> -d</font><font color="#E6DB74">.</font><font color="#FD971F"> -f2</font><font color="#E6DB74">)</font><font color="#FFFFFF">" </font><font color="#FD971F">-lt</font><font color="#FFFFFF"> 13 </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Older than 10.13</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Detected macOS platform older than 10.13</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> 1</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> 11.</font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># We assume Big Sur will be OK for now</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">*)</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Unknown product version, warn and continue</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning: Detected unknown macOS major version: </font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">sw_vers</font><font color="#FD971F"> -productVersion</font><font color="#E6DB74">)</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">Warning TLS capabilities detection may fail</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> ;;</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> ;;</font> |
| |
# Return strong TLS 1.2-1.3 cipher suites in OpenSSL or GnuTLS syntax. TLS 1.2 | <font color="#FFFFFF"> </font><font color="#F92672">esac</font> |
# excludes non-ECDHE and non-AEAD cipher suites. DHE is excluded due to bad | |
# DH params often found on servers (see RFC 7919). Sequence matches or is | |
# similar to Firefox 68 ESR with weak cipher suites disabled via about:config. | |
# $1 must be openssl or gnutls. | |
get_strong_ciphersuites_for() { | |
if [ "$1" = "openssl" ]; then | |
# OpenSSL is forgiving of unknown values, no problems with TLS 1.3 values on versions that don't support it yet. | |
echo "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384" | |
elif [ "$1" = "gnutls" ]; then | |
# GnuTLS isn't forgiving of unknown values, so this may require a GnuTLS version that supports TLS 1.3 even if wget doesn't. | |
# Begin with SECURE128 (and higher) then remove/add to build cipher suites. Produces same 9 cipher suites as OpenSSL but in slightly different order. | |
echo "SECURE128:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-DTLS-ALL:-CIPHER-ALL:-MAC-ALL:-KX-ALL:+AEAD:+ECDHE-ECDSA:+ECDHE-RSA:+AES-128-GCM:+CHACHA20-POLY1305:+AES-256-GCM" | |
fi | |
} | |
| |
main "$@" || exit 1 | <font color="#FFFFFF"> </font><font color="#F92672">for</font><font color="#FFFFFF"> _arg </font><font color="#F92672">in</font><font color="#FFFFFF"> "$@"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">do</font> |
</code></WRAP> | <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#F92672">!</font><font color="#FFFFFF"> "$_cmd"</font><font color="#FD971F"> --help</font><font color="#FFFFFF"> "$_category" </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#F92672"> --</font><font color="#FFFFFF"> "$_arg"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">return</font><font color="#FFFFFF"> 1</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">done</font> |
| |
| <font color="#FFFFFF"> true </font><font color="#7C7865"># not strictly needed</font> |
| <font color="#FFFFFF">}</font> |
| |
| <font color="#7C7865"># Check if curl supports the --retry flag, then pass it to the curl invocation.</font> |
| <font color="#A6E22E">check_curl_for_retry_support</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _retry_supported</font><font color="#F92672">=</font><font color="#FFFFFF">""</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_help_for "</font><font color="#E6DB74">notspecified</font><font color="#FFFFFF">" "</font><font color="#E6DB74">curl</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--retry</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _retry_supported</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">--retry 3</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_help_for "</font><font color="#E6DB74">notspecified</font><font color="#FFFFFF">" "</font><font color="#E6DB74">curl</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--continue-at</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># "-C -" tells curl to automatically find where to resume the download when retrying.</font> |
| <font color="#FFFFFF"> _retry_supported</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">--retry 3 -C -</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> RETVAL</font><font color="#F92672">=</font><font color="#FFFFFF">"$_retry_supported"</font> |
| <font color="#FFFFFF">}</font> |
| |
| <font color="#7C7865"># Return cipher suite string specified by user, otherwise return strong TLS 1.2-1.3 cipher suites</font> |
| <font color="#7C7865"># if support by local tools is detected. Detection currently supports these curl backends:</font> |
| <font color="#7C7865"># GnuTLS and OpenSSL (possibly also LibreSSL and BoringSSL). Return value can be empty.</font> |
| <font color="#A6E22E">get_ciphersuites_for_curl</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">RUSTUP_TLS_CIPHERSUITES</font><font color="#F92672">-</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># user specified custom cipher suites, assume they know what they're doing</font> |
| <font color="#FFFFFF"> RETVAL</font><font color="#F92672">=</font><font color="#FFFFFF">"$RUSTUP_TLS_CIPHERSUITES"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">return</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _openssl_syntax</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">no</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _gnutls_syntax</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">no</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _backend_supported</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">yes</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> curl</font><font color="#FD971F"> -V</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74"> OpenSSL/</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _openssl_syntax</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">yes</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> curl</font><font color="#FD971F"> -V</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -iq</font><font color="#FFFFFF"> '</font><font color="#E6DB74"> LibreSSL/</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _openssl_syntax</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">yes</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> curl</font><font color="#FD971F"> -V</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -iq</font><font color="#FFFFFF"> '</font><font color="#E6DB74"> BoringSSL/</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _openssl_syntax</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">yes</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> curl</font><font color="#FD971F"> -V</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -iq</font><font color="#FFFFFF"> '</font><font color="#E6DB74"> GnuTLS/</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _gnutls_syntax</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">yes</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">else</font> |
| <font color="#FFFFFF"> _backend_supported</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">no</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _args_supported</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">no</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_backend_supported" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">yes</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_help_for "</font><font color="#E6DB74">notspecified</font><font color="#FFFFFF">" "</font><font color="#E6DB74">curl</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--tlsv1.2</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--ciphers</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--proto</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _args_supported</font><font color="#F92672">=</font><font color="#FFFFFF">"</font><font color="#E6DB74">yes</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _cs</font><font color="#F92672">=</font><font color="#FFFFFF">""</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_args_supported" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">yes</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_openssl_syntax" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">yes</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _cs</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_strong_ciphersuites_for</font><font color="#E6DB74"> </font><font color="#FFFFFF">"</font><font color="#E6DB74">openssl</font><font color="#FFFFFF">"</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$_gnutls_syntax" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">yes</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _cs</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_strong_ciphersuites_for</font><font color="#E6DB74"> </font><font color="#FFFFFF">"</font><font color="#E6DB74">gnutls</font><font color="#FFFFFF">"</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> RETVAL</font><font color="#F92672">=</font><font color="#FFFFFF">"$_cs"</font> |
| <font color="#FFFFFF">}</font> |
| |
| <font color="#7C7865"># Return cipher suite string specified by user, otherwise return strong TLS 1.2-1.3 cipher suites</font> |
| <font color="#7C7865"># if support by local tools is detected. Detection currently supports these wget backends:</font> |
| <font color="#7C7865"># GnuTLS and OpenSSL (possibly also LibreSSL and BoringSSL). Return value can be empty.</font> |
| <font color="#A6E22E">get_ciphersuites_for_wget</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> </font><font color="#FD971F">-n</font><font color="#FFFFFF"> "$</font><font color="#E6DB74">{</font><font color="#FFFFFF">RUSTUP_TLS_CIPHERSUITES</font><font color="#F92672">-</font><font color="#E6DB74">}</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># user specified custom cipher suites, assume they know what they're doing</font> |
| <font color="#FFFFFF"> RETVAL</font><font color="#F92672">=</font><font color="#FFFFFF">"$RUSTUP_TLS_CIPHERSUITES"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">return</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> </font><font color="#F92672">local</font><font color="#FFFFFF"> _cs</font><font color="#F92672">=</font><font color="#FFFFFF">""</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> wget</font><font color="#FD971F"> -V</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74">\-DHAVE_LIBSSL</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_help_for "</font><font color="#E6DB74">notspecified</font><font color="#FFFFFF">" "</font><font color="#E6DB74">wget</font><font color="#FFFFFF">" "</font><font color="#E6DB74">TLSv1_2</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--ciphers</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--https-only</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--secure-protocol</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _cs</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_strong_ciphersuites_for</font><font color="#E6DB74"> </font><font color="#FFFFFF">"</font><font color="#E6DB74">openssl</font><font color="#FFFFFF">"</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> wget</font><font color="#FD971F"> -V</font><font color="#FFFFFF"> </font><font color="#F92672">|</font><font color="#FFFFFF"> grep</font><font color="#FD971F"> -q</font><font color="#FFFFFF"> '</font><font color="#E6DB74">\-DHAVE_LIBGNUTLS</font><font color="#FFFFFF">'</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># "unspecified" is for arch, allows for possibility old OS using macports, homebrew, etc.</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> check_help_for "</font><font color="#E6DB74">notspecified</font><font color="#FFFFFF">" "</font><font color="#E6DB74">wget</font><font color="#FFFFFF">" "</font><font color="#E6DB74">TLSv1_2</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--ciphers</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--https-only</font><font color="#FFFFFF">" "</font><font color="#E6DB74">--secure-protocol</font><font color="#FFFFFF">"</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> _cs</font><font color="#F92672">=</font><font color="#FFFFFF">$</font><font color="#E6DB74">(</font><font color="#FFFFFF">get_strong_ciphersuites_for</font><font color="#E6DB74"> </font><font color="#FFFFFF">"</font><font color="#E6DB74">gnutls</font><font color="#FFFFFF">"</font><font color="#E6DB74">)</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| |
| <font color="#FFFFFF"> RETVAL</font><font color="#F92672">=</font><font color="#FFFFFF">"$_cs"</font> |
| <font color="#FFFFFF">}</font> |
| |
| <font color="#7C7865"># Return strong TLS 1.2-1.3 cipher suites in OpenSSL or GnuTLS syntax. TLS 1.2</font> |
| <font color="#7C7865"># excludes non-ECDHE and non-AEAD cipher suites. DHE is excluded due to bad</font> |
| <font color="#7C7865"># DH params often found on servers (see RFC 7919). Sequence matches or is</font> |
| <font color="#7C7865"># similar to Firefox 68 ESR with weak cipher suites disabled via about:config.</font> |
| <font color="#7C7865"># $1 must be openssl or gnutls.</font> |
| <font color="#A6E22E">get_strong_ciphersuites_for</font><font color="#FFFFFF">() {</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">if</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$1" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">openssl</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># OpenSSL is forgiving of unknown values, no problems with TLS 1.3 values on versions that don't support it yet.</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">elif</font><font color="#FFFFFF"> </font><font color="#66D9EF">[</font><font color="#FFFFFF"> "$1" </font><font color="#F92672">=</font><font color="#FFFFFF"> "</font><font color="#E6DB74">gnutls</font><font color="#FFFFFF">" </font><font color="#66D9EF">]</font><font color="#F92672">;</font><font color="#FFFFFF"> </font><font color="#F92672">then</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># GnuTLS isn't forgiving of unknown values, so this may require a GnuTLS version that supports TLS 1.3 even if wget doesn't.</font> |
| <font color="#FFFFFF"> </font><font color="#7C7865"># Begin with SECURE128 (and higher) then remove/add to build cipher suites. Produces same 9 cipher suites as OpenSSL but in slightly different order.</font> |
| <font color="#FFFFFF"> </font><font color="#66D9EF">echo</font><font color="#FFFFFF"> "</font><font color="#E6DB74">SECURE128:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-DTLS-ALL:-CIPHER-ALL:-MAC-ALL:-KX-ALL:+AEAD:+ECDHE-ECDSA:+ECDHE-RSA:+AES-128-GCM:+CHACHA20-POLY1305:+AES-256-GCM</font><font color="#FFFFFF">"</font> |
| <font color="#FFFFFF"> </font><font color="#F92672">fi</font> |
| <font color="#FFFFFF">}</font> |
| |
| <font color="#FFFFFF">main "$@" </font><font color="#F92672">||</font><font color="#FFFFFF"> </font><font color="#66D9EF">exit</font><font color="#FFFFFF"> 1</font> |
| </pre></html></WRAP> |
| |