Skip to content

Instantly share code, notes, and snippets.

@hamidreza-s
Created August 11, 2017 14:11
Show Gist options
  • Save hamidreza-s/aaf17dca3218afeebed2842e17b19678 to your computer and use it in GitHub Desktop.
Save hamidreza-s/aaf17dca3218afeebed2842e17b19678 to your computer and use it in GitHub Desktop.
A module for calculating access mode of unix files based on the mode_t bit-bucket value.
-module(file_mode_calc).
-export([run/0]).
-include_lib("kernel/include/file.hrl").
%% source: https://jameshfisher.github.io/2017/02/24/what-is-mode_t.html
-define(S_IRWXU, 8#0000700).
-define(S_IRUSR, 8#0000400).
-define(S_IWUSR, 8#0000200).
-define(S_IXUSR, 8#0000100).
run() ->
FilePath = "/tmp/mode/foo",
{ok, #file_info{mode = Mode}} = file:read_file_info(FilePath),
ModeBin = integer_to_list(Mode, 2),
ModeOct = integer_to_list(Mode, 8),
ModeDec = Mode,
Read = Mode band ?S_IRUSR,
Write = Mode band ?S_IWUSR,
Execute = Mode band ?S_IXUSR,
ReadWrite = Mode band (?S_IRUSR bor ?S_IWUSR),
ReadBin = integer_to_list(Read, 2),
WriteBin = integer_to_list(Write, 2),
ExecuteBin = integer_to_list(Execute, 2),
ReadWriteBin = integer_to_list(ReadWrite, 2),
{{mode_bin, ModeBin},
{mode_dec, ModeDec},
{mode_oct, ModeOct},
{read, Read, ReadBin, {bool, ((Mode bsr 8) band 1)}, length(ReadBin)},
{write, Write, WriteBin, {bool, ((Mode bsr 7) band 1)}, length(WriteBin)},
{execute, Execute, ExecuteBin, {bool, ((Mode bsr 6) band 1)}, length(ExecuteBin)},
{read_write, ReadWrite, ReadWriteBin, length(ReadWriteBin)}}.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment