int off;
int pad = 0;
NTSTATUS status;
+ DATA_BLOB blob = data_blob_null;
struct readdir_attr_data *readdir_attr_data = NULL;
if (!(mode & FILE_ATTRIBUTE_DIRECTORY)) {
break;
+ /* SMB2 UNIX Extension. */
+
+ case SMB2_FIND_POSIX_INFORMATION:
+ p+= 4;
+ SIVAL(p,0,reskey); p+= 4; /* Used for continuing search. */
+
+ if (!(conn->sconn->using_smb2)) {
+ return NT_STATUS_INVALID_LEVEL;
+ }
+ if (unix_extensions_enabled() == false) {
+ return NT_STATUS_INVALID_LEVEL;
+ }
+ blob = store_smb2_posix_info(ctx,
+ conn,
+ &smb_fname->st,
+ 0,
+ mode);
+ if (blob.data == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ /* Space for the blob ? */
+ if (PTR_DIFF(end_data, p) < blob.length) {
+ data_blob_free(&blob);
+ /* Same error that srvstr_push returns. */
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+ memcpy(p, blob.data, blob.length);
+ p += blob.length;
+ data_blob_free(&blob);
+
+ /* Now add the filename string. */
+ nameptr = p;
+ p += 4;
+ status = srvstr_push(base_data, flags2, p, fname,
+ PTR_DIFF(end_data, p), 0, &len);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+ SIVAL(nameptr, 0, len);
+
+ p += len;
+
+ len = PTR_DIFF(p, pdata);
+ pad = (len + (align-1)) & ~(align-1);
+ /*
+ * offset to the next entry, the caller
+ * will overwrite it for the last entry
+ * that's why we always include the padding
+ */
+ SIVAL(pdata,0,pad);
+ /*
+ * set padding to zero
+ */
+ if (do_pad) {
+ memset(p, 0, pad - len);
+ p = pdata + pad;
+ } else {
+ p = pdata + len;
+ }
+
+ break;
+
default:
return NT_STATUS_INVALID_LEVEL;
}
case SMB_FIND_FILE_UNIX_INFO2:
/* Always use filesystem for UNIX mtime query. */
ask_sharemode = false;
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
goto out;
}
case SMB_FIND_FILE_UNIX_INFO2:
/* Always use filesystem for UNIX mtime query. */
ask_sharemode = false;
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
return;
}
bool large_read = !srv_is_signing_active(xconn);
int encrypt_caps = 0;
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
return NT_STATUS_INVALID_LEVEL;
}
int rc;
vfs_statvfs_struct svfs;
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
return NT_STATUS_INVALID_LEVEL;
}
uint32_t sid_bytes;
int i;
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
return NT_STATUS_INVALID_LEVEL;
}
switch(info_level) {
case SMB_SET_CIFS_UNIX_INFO:
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
DEBUG(2,("call_trans2setfsinfo: "
"SMB_SET_CIFS_UNIX_INFO is invalid with "
"unix extensions off\n"));
size_t param_len = 0;
size_t data_len = total_data;
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
reply_nterror(
req,
NT_STATUS_INVALID_LEVEL);
uint32_t access_mask = 0;
size_t len = 0;
- if (INFO_LEVEL_IS_UNIX(info_level) && !lp_unix_extensions()) {
+ if (INFO_LEVEL_IS_UNIX(info_level) && !unix_extensions_enabled()) {
return NT_STATUS_INVALID_LEVEL;
}
if (!(conn->sconn->using_smb2)) {
return NT_STATUS_INVALID_LEVEL;
}
- if (lp_unix_extensions() == false) {
+ if (unix_extensions_enabled() == false) {
return NT_STATUS_INVALID_LEVEL;
}
if (fsp == NULL) {
DEBUG(3,("call_trans2qfilepathinfo: TRANSACT2_QFILEINFO: level = %d\n", info_level));
- if (INFO_LEVEL_IS_UNIX(info_level) && !lp_unix_extensions()) {
+ if (INFO_LEVEL_IS_UNIX(info_level) && !unix_extensions_enabled()) {
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
return;
}
DEBUG(3,("call_trans2qfilepathinfo: TRANSACT2_QPATHINFO: level = %d\n", info_level));
if (INFO_LEVEL_IS_UNIX(info_level)) {
- if (!lp_unix_extensions()) {
+ if (!unix_extensions_enabled()) {
reply_nterror(req, NT_STATUS_INVALID_LEVEL);
return;
}
*ret_data_size = 0;
- if (INFO_LEVEL_IS_UNIX(info_level) && !lp_unix_extensions()) {
+ if (INFO_LEVEL_IS_UNIX(info_level) && !unix_extensions_enabled()) {
return NT_STATUS_INVALID_LEVEL;
}