Changeset View
Changeset View
Standalone View
Standalone View
smb/kio_smb_browse.cpp
Show First 20 Lines • Show All 49 Lines • ▼ Show 20 Line(s) | 45 | { | |||
---|---|---|---|---|---|
50 | } else { | 50 | } else { | ||
51 | cacheStatErr = errno; | 51 | cacheStatErr = errno; | ||
52 | } | 52 | } | ||
53 | qCDebug(KIO_SMB) << "size " << (KIO::filesize_t)st->st_size; | 53 | qCDebug(KIO_SMB) << "size " << (KIO::filesize_t)st->st_size; | ||
54 | return cacheStatErr; | 54 | return cacheStatErr; | ||
55 | } | 55 | } | ||
56 | 56 | | |||
57 | //--------------------------------------------------------------------------- | 57 | //--------------------------------------------------------------------------- | ||
58 | bool SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry, bool ignore_errors) | 58 | int SMBSlave::browse_stat_path(const SMBUrl& _url, UDSEntry& udsentry) | ||
59 | // Returns: true on success, false on failure | | |||
60 | { | 59 | { | ||
61 | SMBUrl url = _url; | 60 | SMBUrl url = _url; | ||
62 | 61 | | |||
63 | int cacheStatErr = cache_stat(url, &st); | 62 | int cacheStatErr = cache_stat(url, &st); | ||
64 | if(cacheStatErr == 0) | 63 | if(cacheStatErr == 0) | ||
65 | { | 64 | { | ||
66 | if(!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) | 65 | if(!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) | ||
67 | { | 66 | { | ||
68 | qCDebug(KIO_SMB) << "mode: "<< st.st_mode; | 67 | qCDebug(KIO_SMB) << "mode: "<< st.st_mode; | ||
69 | warning(i18n("%1:\n" | 68 | warning(i18n("%1:\n" | ||
70 | "Unknown file type, neither directory or file.", url.toDisplayString())); | 69 | "Unknown file type, neither directory or file.", url.toDisplayString())); | ||
71 | return false; | 70 | return EINVAL; | ||
72 | } | 71 | } | ||
73 | 72 | | |||
74 | udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, st.st_mode & S_IFMT); | 73 | udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, st.st_mode & S_IFMT); | ||
75 | udsentry.insert(KIO::UDSEntry::UDS_SIZE, st.st_size); | 74 | udsentry.insert(KIO::UDSEntry::UDS_SIZE, st.st_size); | ||
76 | 75 | | |||
77 | QString str; | 76 | QString str; | ||
78 | uid_t uid = st.st_uid; | 77 | uid_t uid = st.st_uid; | ||
79 | struct passwd *user = getpwuid( uid ); | 78 | struct passwd *user = getpwuid( uid ); | ||
Show All 11 Lines | 89 | else | |||
91 | str = QString::number( gid ); | 90 | str = QString::number( gid ); | ||
92 | udsentry.insert(KIO::UDSEntry::UDS_GROUP, str); | 91 | udsentry.insert(KIO::UDSEntry::UDS_GROUP, str); | ||
93 | 92 | | |||
94 | udsentry.insert(KIO::UDSEntry::UDS_ACCESS, st.st_mode & 07777); | 93 | udsentry.insert(KIO::UDSEntry::UDS_ACCESS, st.st_mode & 07777); | ||
95 | udsentry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, st.st_mtime); | 94 | udsentry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, st.st_mtime); | ||
96 | udsentry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, st.st_atime); | 95 | udsentry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, st.st_atime); | ||
97 | // No, st_ctime is not UDS_CREATION_TIME... | 96 | // No, st_ctime is not UDS_CREATION_TIME... | ||
98 | } | 97 | } | ||
99 | else | | |||
100 | { | | |||
101 | if (!ignore_errors) { | | |||
102 | if (cacheStatErr == EPERM || cacheStatErr == EACCES) | | |||
103 | if (checkPassword(url)) { | | |||
104 | redirection( url ); | | |||
105 | return false; | | |||
106 | } | | |||
107 | | ||||
108 | reportError(url, cacheStatErr); | | |||
109 | } else if (cacheStatErr == ENOENT || cacheStatErr == ENOTDIR) { | | |||
110 | warning(i18n("File does not exist: %1", url.url())); | | |||
111 | } | | |||
112 | qCDebug(KIO_SMB) << "ERROR!!"; | | |||
113 | return false; | | |||
114 | } | | |||
115 | 98 | | |||
116 | return true; | 99 | return cacheStatErr; | ||
117 | } | 100 | } | ||
118 | 101 | | |||
119 | //=========================================================================== | 102 | //=========================================================================== | ||
120 | void SMBSlave::stat( const QUrl& kurl ) | 103 | void SMBSlave::stat( const QUrl& kurl ) | ||
121 | { | 104 | { | ||
122 | qCDebug(KIO_SMB) << kurl; | 105 | qCDebug(KIO_SMB) << kurl; | ||
123 | // make a valid URL | 106 | // make a valid URL | ||
124 | QUrl url = checkURL(kurl); | 107 | QUrl url = checkURL(kurl); | ||
Show All 11 Lines | |||||
136 | 119 | | |||
137 | UDSEntry udsentry; | 120 | UDSEntry udsentry; | ||
138 | // Set name | 121 | // Set name | ||
139 | udsentry.insert( KIO::UDSEntry::UDS_NAME, kurl.fileName() ); | 122 | udsentry.insert( KIO::UDSEntry::UDS_NAME, kurl.fileName() ); | ||
140 | 123 | | |||
141 | switch(m_current_url.getType()) | 124 | switch(m_current_url.getType()) | ||
142 | { | 125 | { | ||
143 | case SMBURLTYPE_UNKNOWN: | 126 | case SMBURLTYPE_UNKNOWN: | ||
144 | error(ERR_MALFORMED_URL,m_current_url.toDisplayString()); | 127 | error(ERR_MALFORMED_URL, url.toDisplayString()); | ||
145 | return; | 128 | return; | ||
146 | 129 | | |||
147 | case SMBURLTYPE_ENTIRE_NETWORK: | 130 | case SMBURLTYPE_ENTIRE_NETWORK: | ||
148 | case SMBURLTYPE_WORKGROUP_OR_SERVER: | 131 | case SMBURLTYPE_WORKGROUP_OR_SERVER: | ||
149 | udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); | 132 | udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); | ||
150 | break; | 133 | break; | ||
151 | 134 | | |||
152 | case SMBURLTYPE_SHARE_OR_PATH: | 135 | case SMBURLTYPE_SHARE_OR_PATH: | ||
153 | if (browse_stat_path(m_current_url, udsentry, false)) | 136 | { | ||
154 | break; | 137 | int ret = browse_stat_path(m_current_url, udsentry); | ||
155 | else { | 138 | | ||
156 | qCDebug(KIO_SMB) << "ERROR!!"; | 139 | if (ret == EPERM || ret == EACCES) | ||
140 | { | ||||
141 | SMBUrl smbUrl(url); | ||||
142 | | ||||
143 | if (checkPassword(smbUrl)) | ||||
144 | { | ||||
145 | redirection(smbUrl); | ||||
157 | finished(); | 146 | finished(); | ||
147 | } | ||||
148 | else | ||||
149 | { | ||||
150 | reportError(url, ret); | ||||
151 | } | ||||
152 | | ||||
158 | return; | 153 | return; | ||
159 | } | 154 | } | ||
155 | else if (ret == ENOENT || ret == ENOTDIR) | ||||
156 | { | ||||
157 | warning(i18n("File does not exist: %1", url.url())); | ||||
158 | finished(); | ||||
159 | return; | ||||
160 | } | ||||
161 | else if (ret != 0) | ||||
162 | { | ||||
163 | qCDebug(KIO_SMB) << "stat() error" << ret << url; | ||||
164 | reportError(url, ret); | ||||
165 | return; | ||||
166 | } | ||||
167 | break; | ||||
168 | } | ||||
160 | default: | 169 | default: | ||
161 | qCDebug(KIO_SMB) << "UNKNOWN " << url; | 170 | qCDebug(KIO_SMB) << "UNKNOWN " << url; | ||
162 | finished(); | 171 | finished(); | ||
163 | return; | 172 | return; | ||
164 | } | 173 | } | ||
165 | 174 | | |||
166 | statEntry(udsentry); | 175 | statEntry(udsentry); | ||
167 | finished(); | 176 | finished(); | ||
▲ Show 20 Lines • Show All 193 Lines • ▼ Show 20 Line(s) | 369 | { | |||
361 | dir_is_root = false; | 370 | dir_is_root = false; | ||
362 | // fprintf(stderr,"----------- hide: -%s-\n",dirp->name); | 371 | // fprintf(stderr,"----------- hide: -%s-\n",dirp->name); | ||
363 | // do nothing and hide the hidden shares | 372 | // do nothing and hide the hidden shares | ||
364 | } | 373 | } | ||
365 | else if(dirp->smbc_type == SMBC_FILE) | 374 | else if(dirp->smbc_type == SMBC_FILE) | ||
366 | { | 375 | { | ||
367 | // Set stat information | 376 | // Set stat information | ||
368 | m_current_url.addPath(dirpName); | 377 | m_current_url.addPath(dirpName); | ||
369 | browse_stat_path(m_current_url, udsentry, true); | 378 | browse_stat_path(m_current_url, udsentry); | ||
370 | m_current_url.cd(".."); | 379 | m_current_url.cd(".."); | ||
371 | 380 | | |||
372 | // Call base class to list entry | 381 | // Call base class to list entry | ||
373 | listEntry(udsentry); | 382 | listEntry(udsentry); | ||
374 | } | 383 | } | ||
375 | else if(dirp->smbc_type == SMBC_DIR) | 384 | else if(dirp->smbc_type == SMBC_DIR) | ||
376 | { | 385 | { | ||
377 | m_current_url.addPath(dirpName); | 386 | m_current_url.addPath(dirpName); | ||
378 | browse_stat_path(m_current_url, udsentry, true); | 387 | browse_stat_path(m_current_url, udsentry); | ||
379 | m_current_url.cd(".."); | 388 | m_current_url.cd(".."); | ||
380 | 389 | | |||
381 | // Call base class to list entry | 390 | // Call base class to list entry | ||
382 | listEntry(udsentry); | 391 | listEntry(udsentry); | ||
383 | } | 392 | } | ||
384 | else if(dirp->smbc_type == SMBC_SERVER || | 393 | else if(dirp->smbc_type == SMBC_SERVER || | ||
385 | dirp->smbc_type == SMBC_FILE_SHARE) | 394 | dirp->smbc_type == SMBC_FILE_SHARE) | ||
386 | { | 395 | { | ||
▲ Show 20 Lines • Show All 54 Lines • ▼ Show 20 Line(s) | 449 | if (dir_is_root) { | |||
441 | udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); | 450 | udsentry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); | ||
442 | udsentry.insert(KIO::UDSEntry::UDS_NAME, "."); | 451 | udsentry.insert(KIO::UDSEntry::UDS_NAME, "."); | ||
443 | udsentry.insert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH)); | 452 | udsentry.insert(KIO::UDSEntry::UDS_ACCESS, (S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH)); | ||
444 | udsentry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QLatin1String("application/x-smb-server")); | 453 | udsentry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QLatin1String("application/x-smb-server")); | ||
445 | } | 454 | } | ||
446 | else | 455 | else | ||
447 | { | 456 | { | ||
448 | udsentry.insert(KIO::UDSEntry::UDS_NAME, "."); | 457 | udsentry.insert(KIO::UDSEntry::UDS_NAME, "."); | ||
449 | browse_stat_path(m_current_url, udsentry, true); | 458 | browse_stat_path(m_current_url, udsentry); | ||
450 | } | 459 | } | ||
451 | listEntry(udsentry); | 460 | listEntry(udsentry); | ||
452 | udsentry.clear(); | 461 | udsentry.clear(); | ||
453 | 462 | | |||
454 | // clean up | 463 | // clean up | ||
455 | smbc_closedir(dirfd); | 464 | smbc_closedir(dirfd); | ||
456 | } | 465 | } | ||
457 | else | 466 | else | ||
▲ Show 20 Lines • Show All 50 Lines • Show Last 20 Lines |