diff options
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 1292db50fe65..811ab3dffafa 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -2200,6 +2200,65 @@ GetExtAttrOut: | |||
2200 | 2200 | ||
2201 | #endif /* CONFIG_POSIX */ | 2201 | #endif /* CONFIG_POSIX */ |
2202 | 2202 | ||
2203 | /* Legacy Query Path Information call for lookup to old servers such | ||
2204 | as Win9x/WinME */ | ||
2205 | int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon, | ||
2206 | const unsigned char *searchName, | ||
2207 | FILE_ALL_INFO * pFinfo, | ||
2208 | const struct nls_table *nls_codepage, int remap) | ||
2209 | { | ||
2210 | QUERY_INFORMATION_REQ * pSMB; | ||
2211 | QUERY_INFORMATION_RSP * pSMBr; | ||
2212 | int rc = 0; | ||
2213 | int bytes_returned; | ||
2214 | int name_len; | ||
2215 | |||
2216 | cFYI(1, ("In SMBQPath path %s", searchName)); | ||
2217 | QInfRetry: | ||
2218 | rc = smb_init(SMB_COM_QUERY_INFORMATION, 0, tcon, (void **) &pSMB, | ||
2219 | (void **) &pSMBr); | ||
2220 | if (rc) | ||
2221 | return rc; | ||
2222 | |||
2223 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | ||
2224 | name_len = | ||
2225 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | ||
2226 | PATH_MAX, nls_codepage, remap); | ||
2227 | name_len++; /* trailing null */ | ||
2228 | name_len *= 2; | ||
2229 | } else { | ||
2230 | name_len = strnlen(searchName, PATH_MAX); | ||
2231 | name_len++; /* trailing null */ | ||
2232 | strncpy(pSMB->FileName, searchName, name_len); | ||
2233 | } | ||
2234 | pSMB->BufferFormat = 0x04; | ||
2235 | name_len++; /* account for buffer type byte */ | ||
2236 | pSMB->hdr.smb_buf_length += (__u16) name_len; | ||
2237 | pSMB->ByteCount = cpu_to_le16(name_len); | ||
2238 | |||
2239 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | ||
2240 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | ||
2241 | if (rc) { | ||
2242 | cFYI(1, ("Send error in QueryInfo = %d", rc)); | ||
2243 | } else if (pFinfo) { /* decode response */ | ||
2244 | memset(pFinfo, 0, sizeof(FILE_ALL_INFO)); | ||
2245 | pFinfo->AllocationSize = (__le64) pSMBr->size; | ||
2246 | pFinfo->EndOfFile = (__le64) pSMBr->size; | ||
2247 | pFinfo->Attributes = (__le32) pSMBr->attr; | ||
2248 | } else | ||
2249 | rc = -EIO; /* bad buffer passed in */ | ||
2250 | |||
2251 | cifs_buf_release(pSMB); | ||
2252 | |||
2253 | if (rc == -EAGAIN) | ||
2254 | goto QInfRetry; | ||
2255 | |||
2256 | return rc; | ||
2257 | } | ||
2258 | |||
2259 | |||
2260 | |||
2261 | |||
2203 | int | 2262 | int |
2204 | CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, | 2263 | CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, |
2205 | const unsigned char *searchName, | 2264 | const unsigned char *searchName, |