Exploring how Go’s os.Chmod and os.Stat interact on Windows
Go to file
2024-08-19 16:30:30 -06:00
go.mod First commit 2024-08-19 16:30:30 -06:00
go.sum First commit 2024-08-19 16:30:30 -06:00
main_windows.go First commit 2024-08-19 16:30:30 -06:00
modes.db First commit 2024-08-19 16:30:30 -06:00
README.md First commit 2024-08-19 16:30:30 -06:00

Go file permissions test

by Brandon Dyck brandon@dyck.us

This is an experiment to see how os.Chmod and os.Stat interact on Windows. The program creates a temporary file, then for each possible set of permissions (00777), sets those permissions on the file with os.Chmod and checks the resulting permissions with os.Stat.

Usage

go-perm-test

Prints the results as a CSV in the format

<expected permissions>,<actual permissions>

where each set of permissions is an octal integer.

go-perm-test <filename>

Inserts the results into an SQLite database called filename. There are two objects in the DB schema: a table result_raw(expected INT, actual INT) and a view result.

The result view breaks down the permissions into separate fields: The raw data are in the expected and actual columns, 3-bit fields are in {expected,actual}_{u,g,o} columns, and 1-bit fields are in {expected,actual}_{u,g,o}{r,w,x} columns.

Findings

Permissions as observed through os.Stat depend entirely upon the owner's write bit set through os.Chmod:

sqlite> select distinct actual, expected_uw from result;
actual|expected_uw
292|0
438|1

This obviously isn't an exhaustive treatment of the subject, and I'm not really interested in doing one, but it corraborates Michal Pristass findings.