]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | /* |
2 | * Copyright (C) 2021 SUSE LINUX GmbH | |
3 | * | |
4 | * This is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU Lesser General Public | |
6 | * License version 2.1, as published by the Free Software | |
7 | * Foundation. See file COPYING. | |
8 | * | |
9 | */ | |
10 | ||
11 | #include "ceph_dokan.h" | |
12 | #include "utils.h" | |
13 | #include "dbg.h" | |
14 | ||
15 | #include "common/debug.h" | |
16 | #include "common/dout.h" | |
17 | ||
18 | #define dout_context g_ceph_context | |
19 | #define dout_subsys ceph_subsys_rbd | |
20 | #undef dout_prefix | |
21 | #define dout_prefix *_dout << "rbd-wnbd: " | |
22 | ||
23 | #define check_flag(stream, val, flag) if (val & flag) { stream << "[" #flag "]"; } | |
24 | #define check_flag_eq(stream, val, flag) if (val == flag) { stream << "[" #flag "]"; } | |
25 | ||
26 | ||
27 | void print_credentials(ostringstream& Stream, PDOKAN_FILE_INFO DokanFileInfo) | |
28 | { | |
29 | UCHAR buffer[1024]; | |
30 | DWORD returnLength; | |
31 | CHAR accountName[256]; | |
32 | CHAR domainName[256]; | |
33 | DWORD accountLength = sizeof(accountName) / sizeof(WCHAR); | |
34 | DWORD domainLength = sizeof(domainName) / sizeof(WCHAR); | |
35 | SID_NAME_USE snu; | |
36 | ||
37 | int err = 0; | |
38 | HANDLE handle = DokanOpenRequestorToken(DokanFileInfo); | |
39 | if (handle == INVALID_HANDLE_VALUE) { | |
40 | err = GetLastError(); | |
41 | derr << "DokanOpenRequestorToken failed. Error: " << err << dendl; | |
42 | return; | |
43 | } | |
44 | ||
45 | if (!GetTokenInformation(handle, TokenUser, buffer, | |
46 | sizeof(buffer), &returnLength)) { | |
47 | err = GetLastError(); | |
48 | derr << "GetTokenInformation failed. Error: " << err << dendl; | |
49 | CloseHandle(handle); | |
50 | return; | |
51 | } | |
52 | ||
53 | CloseHandle(handle); | |
54 | ||
55 | PTOKEN_USER tokenUser = (PTOKEN_USER)buffer; | |
56 | if (!LookupAccountSidA(NULL, tokenUser->User.Sid, accountName, | |
57 | &accountLength, domainName, &domainLength, &snu)) { | |
58 | err = GetLastError(); | |
59 | derr << "LookupAccountSid failed. Error: " << err << dendl; | |
60 | return; | |
61 | } | |
62 | ||
63 | Stream << "\n\tAccountName: " << accountName << ", DomainName: " << domainName; | |
64 | } | |
65 | ||
66 | void print_open_params( | |
67 | LPCSTR FilePath, | |
68 | ACCESS_MASK AccessMode, | |
69 | DWORD FlagsAndAttributes, | |
70 | ULONG ShareMode, | |
71 | DWORD CreationDisposition, | |
72 | ULONG CreateOptions, | |
73 | PDOKAN_FILE_INFO DokanFileInfo) | |
74 | { | |
75 | ostringstream o; | |
76 | o << "CreateFile: " << FilePath << ". "; | |
77 | print_credentials(o, DokanFileInfo); | |
78 | ||
79 | o << "\n\tCreateDisposition: " << hex << CreationDisposition << " "; | |
80 | check_flag_eq(o, CreationDisposition, CREATE_NEW); | |
81 | check_flag_eq(o, CreationDisposition, OPEN_ALWAYS); | |
82 | check_flag_eq(o, CreationDisposition, CREATE_ALWAYS); | |
83 | check_flag_eq(o, CreationDisposition, OPEN_EXISTING); | |
84 | check_flag_eq(o, CreationDisposition, TRUNCATE_EXISTING); | |
85 | ||
86 | o << "\n\tShareMode: " << hex << ShareMode << " "; | |
87 | check_flag(o, ShareMode, FILE_SHARE_READ); | |
88 | check_flag(o, ShareMode, FILE_SHARE_WRITE); | |
89 | check_flag(o, ShareMode, FILE_SHARE_DELETE); | |
90 | ||
91 | o << "\n\tAccessMode: " << hex << AccessMode << " "; | |
92 | check_flag(o, AccessMode, GENERIC_READ); | |
93 | check_flag(o, AccessMode, GENERIC_WRITE); | |
94 | check_flag(o, AccessMode, GENERIC_EXECUTE); | |
95 | ||
96 | check_flag(o, AccessMode, WIN32_DELETE); | |
97 | check_flag(o, AccessMode, FILE_READ_DATA); | |
98 | check_flag(o, AccessMode, FILE_READ_ATTRIBUTES); | |
99 | check_flag(o, AccessMode, FILE_READ_EA); | |
100 | check_flag(o, AccessMode, READ_CONTROL); | |
101 | check_flag(o, AccessMode, FILE_WRITE_DATA); | |
102 | check_flag(o, AccessMode, FILE_WRITE_ATTRIBUTES); | |
103 | check_flag(o, AccessMode, FILE_WRITE_EA); | |
104 | check_flag(o, AccessMode, FILE_APPEND_DATA); | |
105 | check_flag(o, AccessMode, WRITE_DAC); | |
106 | check_flag(o, AccessMode, WRITE_OWNER); | |
107 | check_flag(o, AccessMode, SYNCHRONIZE); | |
108 | check_flag(o, AccessMode, FILE_EXECUTE); | |
109 | check_flag(o, AccessMode, STANDARD_RIGHTS_READ); | |
110 | check_flag(o, AccessMode, STANDARD_RIGHTS_WRITE); | |
111 | check_flag(o, AccessMode, STANDARD_RIGHTS_EXECUTE); | |
112 | ||
113 | o << "\n\tFlagsAndAttributes: " << hex << FlagsAndAttributes << " "; | |
114 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_ARCHIVE); | |
115 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_ENCRYPTED); | |
116 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_HIDDEN); | |
117 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_NORMAL); | |
118 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_NOT_CONTENT_INDEXED); | |
119 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_OFFLINE); | |
120 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_READONLY); | |
121 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_SYSTEM); | |
122 | check_flag(o, FlagsAndAttributes, FILE_ATTRIBUTE_TEMPORARY); | |
123 | check_flag(o, FlagsAndAttributes, FILE_FLAG_WRITE_THROUGH); | |
124 | check_flag(o, FlagsAndAttributes, FILE_FLAG_OVERLAPPED); | |
125 | check_flag(o, FlagsAndAttributes, FILE_FLAG_NO_BUFFERING); | |
126 | check_flag(o, FlagsAndAttributes, FILE_FLAG_RANDOM_ACCESS); | |
127 | check_flag(o, FlagsAndAttributes, FILE_FLAG_SEQUENTIAL_SCAN); | |
128 | check_flag(o, FlagsAndAttributes, FILE_FLAG_DELETE_ON_CLOSE); | |
129 | check_flag(o, FlagsAndAttributes, FILE_FLAG_BACKUP_SEMANTICS); | |
130 | check_flag(o, FlagsAndAttributes, FILE_FLAG_POSIX_SEMANTICS); | |
131 | check_flag(o, FlagsAndAttributes, FILE_FLAG_OPEN_REPARSE_POINT); | |
132 | check_flag(o, FlagsAndAttributes, FILE_FLAG_OPEN_NO_RECALL); | |
133 | check_flag(o, FlagsAndAttributes, SECURITY_ANONYMOUS); | |
134 | check_flag(o, FlagsAndAttributes, SECURITY_IDENTIFICATION); | |
135 | check_flag(o, FlagsAndAttributes, SECURITY_IMPERSONATION); | |
136 | check_flag(o, FlagsAndAttributes, SECURITY_DELEGATION); | |
137 | check_flag(o, FlagsAndAttributes, SECURITY_CONTEXT_TRACKING); | |
138 | check_flag(o, FlagsAndAttributes, SECURITY_EFFECTIVE_ONLY); | |
139 | check_flag(o, FlagsAndAttributes, SECURITY_SQOS_PRESENT); | |
140 | ||
141 | o << "\n\tIsDirectory: " << (DokanFileInfo->IsDirectory != NULL); | |
142 | ||
143 | o << "\n\tCreateOptions: " << hex << CreateOptions << " "; | |
144 | check_flag(o, CreateOptions, FILE_DIRECTORY_FILE); | |
145 | check_flag(o, CreateOptions, FILE_WRITE_THROUGH); | |
146 | check_flag(o, CreateOptions, FILE_SEQUENTIAL_ONLY); | |
147 | check_flag(o, CreateOptions, FILE_NO_INTERMEDIATE_BUFFERING); | |
148 | check_flag(o, CreateOptions, FILE_SYNCHRONOUS_IO_ALERT); | |
149 | check_flag(o, CreateOptions, FILE_SYNCHRONOUS_IO_NONALERT); | |
150 | check_flag(o, CreateOptions, FILE_NON_DIRECTORY_FILE); | |
151 | check_flag(o, CreateOptions, FILE_CREATE_TREE_CONNECTION); | |
152 | check_flag(o, CreateOptions, FILE_COMPLETE_IF_OPLOCKED); | |
153 | check_flag(o, CreateOptions, FILE_NO_EA_KNOWLEDGE); | |
154 | check_flag(o, CreateOptions, FILE_OPEN_REMOTE_INSTANCE); | |
155 | check_flag(o, CreateOptions, FILE_RANDOM_ACCESS); | |
156 | check_flag(o, CreateOptions, FILE_DELETE_ON_CLOSE); | |
157 | check_flag(o, CreateOptions, FILE_OPEN_BY_FILE_ID); | |
158 | check_flag(o, CreateOptions, FILE_OPEN_FOR_BACKUP_INTENT); | |
159 | check_flag(o, CreateOptions, FILE_NO_COMPRESSION); | |
160 | check_flag(o, CreateOptions, FILE_OPEN_REQUIRING_OPLOCK); | |
161 | check_flag(o, CreateOptions, FILE_DISALLOW_EXCLUSIVE); | |
162 | check_flag(o, CreateOptions, FILE_RESERVE_OPFILTER); | |
163 | check_flag(o, CreateOptions, FILE_OPEN_REPARSE_POINT); | |
164 | check_flag(o, CreateOptions, FILE_OPEN_NO_RECALL); | |
165 | check_flag(o, CreateOptions, FILE_OPEN_FOR_FREE_SPACE_QUERY); | |
166 | ||
167 | // We're using a high log level since this will only be enabled with the | |
168 | // explicit debug flag. | |
169 | dout(0) << o.str() << dendl; | |
170 | } |