| 834 | } |
| 835 | |
| 836 | TString DecodeOpenMode(ui32 mode0) { |
| 837 | ui32 mode = mode0; |
| 838 | |
| 839 | TStringBuilder r; |
| 840 | |
| 841 | struct TFlagCombo { |
| 842 | ui32 Value; |
| 843 | TStringBuf Name; |
| 844 | }; |
| 845 | |
| 846 | static constexpr TFlagCombo knownFlagCombos[]{ |
| 847 | |
| 848 | #define F(flag) {flag, #flag} |
| 849 | |
| 850 | F(RdWr), |
| 851 | F(RdOnly), |
| 852 | F(WrOnly), |
| 853 | |
| 854 | F(CreateAlways), |
| 855 | F(CreateNew), |
| 856 | F(OpenAlways), |
| 857 | F(TruncExisting), |
| 858 | F(ForAppend), |
| 859 | F(Transient), |
| 860 | F(CloseOnExec), |
| 861 | |
| 862 | F(Temp), |
| 863 | F(Sync), |
| 864 | F(Direct), |
| 865 | F(DirectAligned), |
| 866 | F(Seq), |
| 867 | F(NoReuse), |
| 868 | F(NoReadAhead), |
| 869 | |
| 870 | F(AX), |
| 871 | F(AR), |
| 872 | F(AW), |
| 873 | F(ARW), |
| 874 | |
| 875 | F(AXOther), |
| 876 | F(AWOther), |
| 877 | F(AROther), |
| 878 | F(AXGroup), |
| 879 | F(AWGroup), |
| 880 | F(ARGroup), |
| 881 | F(AXUser), |
| 882 | F(AWUser), |
| 883 | F(ARUser), |
| 884 | |
| 885 | #undef F |
| 886 | |
| 887 | }; |
| 888 | |
| 889 | for (const auto& [flag, name] : knownFlagCombos) { |
| 890 | if ((mode & flag) == flag) { |
| 891 | mode &= ~flag; |
| 892 | if (r) { |
| 893 | r << '|'; |