mirror of
https://github.com/samba-team/samba.git
synced 2025-08-02 00:22:11 +03:00
r150: Make 3.x pass the Samba 4.x RAW-SEARCH tests - except for the
UNIX info levels, and the short case preserve names. Tested with NT - needs more testing. Will work on this more on Monday. Jeremy.
This commit is contained in:
committed by
Gerald (Jerry) Carter
parent
b09d333aed
commit
88a9bca9aa
@ -230,8 +230,8 @@ Byte offset Type name description
|
||||
#define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
|
||||
#define SMB_FIND_FILE_NAMES_INFO 0x103
|
||||
#define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104
|
||||
#define SMB_FIND_FILE_LEVEL_261 0x105
|
||||
#define SMB_FIND_FILE_LEVEL_262 0x106
|
||||
#define SMB_FIND_ID_FULL_DIRECTORY_INFO 0x105
|
||||
#define SMB_FIND_ID_BOTH_DIRECTORY_INFO 0x106
|
||||
|
||||
#define SMB_SET_FILE_BASIC_INFO 0x101
|
||||
#define SMB_SET_FILE_DISPOSITION_INFO 0x102
|
||||
|
@ -128,9 +128,7 @@ static BOOL get_ea_value(TALLOC_CTX *mem_ctx, connection_struct *conn, files_str
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Return a linked list of the total EA's. Plus a guess as to the total size
|
||||
(NB. The is not the total size on the wire - we need to convert to DOS
|
||||
codepage for that).
|
||||
Return a linked list of the total EA's. Plus the total size
|
||||
****************************************************************************/
|
||||
|
||||
static struct ea_list *get_ea_list(TALLOC_CTX *mem_ctx, connection_struct *conn, files_struct *fsp, const char *fname, size_t *pea_total_len)
|
||||
@ -143,9 +141,7 @@ static struct ea_list *get_ea_list(TALLOC_CTX *mem_ctx, connection_struct *conn,
|
||||
int i;
|
||||
struct ea_list *ea_list_head = NULL;
|
||||
|
||||
if (pea_total_len) {
|
||||
*pea_total_len = 0;
|
||||
}
|
||||
*pea_total_len = 0;
|
||||
|
||||
if (!lp_ea_support(SNUM(conn))) {
|
||||
return NULL;
|
||||
@ -186,22 +182,29 @@ static struct ea_list *get_ea_list(TALLOC_CTX *mem_ctx, connection_struct *conn,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pea_total_len) {
|
||||
*pea_total_len += 4 + strlen(p) + 1 + listp->ea.value.length;
|
||||
{
|
||||
fstring dos_ea_name;
|
||||
push_ascii_fstring(dos_ea_name, listp->ea.name);
|
||||
*pea_total_len += 4 + strlen(dos_ea_name) + 1 + listp->ea.value.length;
|
||||
DEBUG(10,("get_ea_list: total_len = %u, %s, val len = %u\n",
|
||||
*pea_total_len, dos_ea_name,
|
||||
(unsigned int)listp->ea.value.length ));
|
||||
}
|
||||
DLIST_ADD_END(ea_list_head, listp, tmp);
|
||||
}
|
||||
/* Add on 4 for total length. */
|
||||
if (*pea_total_len) {
|
||||
*pea_total_len += 4;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add on 4 for total length. */
|
||||
if (pea_total_len) {
|
||||
*pea_total_len += 4;
|
||||
}
|
||||
DEBUG(10,("get_ea_list: total_len = %u\n", *pea_total_len));
|
||||
return ea_list_head;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Fill a qfilepathinfo buffer with EA's.
|
||||
Fill a qfilepathinfo buffer with EA's. Returns the length of the buffer
|
||||
that was filled.
|
||||
****************************************************************************/
|
||||
|
||||
static unsigned int fill_ea_buffer(char *pdata, unsigned int total_data_size,
|
||||
@ -210,16 +213,21 @@ static unsigned int fill_ea_buffer(char *pdata, unsigned int total_data_size,
|
||||
unsigned int ret_data_size = 4;
|
||||
char *p = pdata;
|
||||
size_t total_ea_len;
|
||||
TALLOC_CTX *mem_ctx = talloc_init("fill_ea_buffer");
|
||||
struct ea_list *ea_list = get_ea_list(mem_ctx, conn, fsp, fname, &total_ea_len);
|
||||
TALLOC_CTX *mem_ctx;
|
||||
struct ea_list *ea_list;
|
||||
|
||||
SMB_ASSERT(total_data_size >= 4);
|
||||
|
||||
SIVAL(pdata,0,0);
|
||||
if (!lp_ea_support(SNUM(conn))) {
|
||||
return 4;
|
||||
}
|
||||
mem_ctx = talloc_init("fill_ea_buffer");
|
||||
if (!mem_ctx) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
ea_list = get_ea_list(mem_ctx, conn, fsp, fname, &total_ea_len);
|
||||
if (!ea_list) {
|
||||
talloc_destroy(mem_ctx);
|
||||
return 4;
|
||||
@ -230,7 +238,6 @@ static unsigned int fill_ea_buffer(char *pdata, unsigned int total_data_size,
|
||||
return 4;
|
||||
}
|
||||
|
||||
total_data_size -= 4;
|
||||
for (p = pdata + 4; ea_list; ea_list = ea_list->next) {
|
||||
size_t dos_namelen;
|
||||
fstring dos_ea_name;
|
||||
@ -258,6 +265,8 @@ static unsigned int fill_ea_buffer(char *pdata, unsigned int total_data_size,
|
||||
}
|
||||
|
||||
ret_data_size = PTR_DIFF(p, pdata);
|
||||
DEBUG(10,("fill_ea_buffer: data_size = %u, total_ea_len = %u\n",
|
||||
ret_data_size, total_ea_len ));
|
||||
talloc_destroy(mem_ctx);
|
||||
SIVAL(pdata,0,ret_data_size);
|
||||
return ret_data_size;
|
||||
@ -266,8 +275,12 @@ static unsigned int fill_ea_buffer(char *pdata, unsigned int total_data_size,
|
||||
static unsigned int estimate_ea_size(connection_struct *conn, files_struct *fsp, const char *fname)
|
||||
{
|
||||
size_t total_ea_len = 0;
|
||||
TALLOC_CTX *mem_ctx = talloc_init("estimate_ea_size");
|
||||
TALLOC_CTX *mem_ctx = NULL;
|
||||
|
||||
if (!lp_ea_support(SNUM(conn))) {
|
||||
return 0;
|
||||
}
|
||||
mem_ctx = talloc_init("estimate_ea_size");
|
||||
(void)get_ea_list(mem_ctx, conn, fsp, fname, &total_ea_len);
|
||||
talloc_destroy(mem_ctx);
|
||||
return total_ea_len;
|
||||
@ -961,6 +974,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
|
||||
switch (info_level) {
|
||||
case SMB_INFO_STANDARD:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_INFO_STANDARD\n"));
|
||||
if(requires_resume_key) {
|
||||
SIVAL(p,0,reskey);
|
||||
p += 4;
|
||||
@ -975,14 +989,24 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
nameptr = p;
|
||||
p += align_string(outbuf, p, 0);
|
||||
len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE);
|
||||
if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS)
|
||||
SCVAL(nameptr, -1, len-2);
|
||||
else
|
||||
SCVAL(nameptr, -1, len-1);
|
||||
if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS) {
|
||||
if (len > 2) {
|
||||
SCVAL(nameptr, -1, len - 2);
|
||||
} else {
|
||||
SCVAL(nameptr, -1, 0);
|
||||
}
|
||||
} else {
|
||||
if (len > 1) {
|
||||
SCVAL(nameptr, -1, len - 1);
|
||||
} else {
|
||||
SCVAL(nameptr, -1, 0);
|
||||
}
|
||||
}
|
||||
p += len;
|
||||
break;
|
||||
|
||||
case SMB_INFO_QUERY_EA_SIZE:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_INFO_QUERY_EA_SIZE\n"));
|
||||
if(requires_resume_key) {
|
||||
SIVAL(p,0,reskey);
|
||||
p += 4;
|
||||
@ -993,18 +1017,33 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
SIVAL(p,l2_cbFile,(uint32)file_size);
|
||||
SIVAL(p,l2_cbFileAlloc,(uint32)allocation_size);
|
||||
SSVAL(p,l2_attrFile,mode);
|
||||
SIVAL(p,l2_cbList,0); /* No extended attributes */
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, NULL, pathreal);
|
||||
SIVAL(p,l2_cbList,ea_size); /* Extended attributes */
|
||||
}
|
||||
p += l2_achName;
|
||||
nameptr = p;
|
||||
nameptr = p - 1;
|
||||
len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE | STR_NOALIGN);
|
||||
if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS)
|
||||
SCVAL(nameptr, -1, len-2);
|
||||
else
|
||||
SCVAL(nameptr, -1, len-1);
|
||||
if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS) {
|
||||
if (len > 2) {
|
||||
len -= 2;
|
||||
} else {
|
||||
len = 0;
|
||||
}
|
||||
} else {
|
||||
if (len > 1) {
|
||||
len -= 1;
|
||||
} else {
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
SCVAL(nameptr,0,len);
|
||||
p += len;
|
||||
SCVAL(p,0,0); p += 1; /* Extra zero byte ? - why.. */
|
||||
break;
|
||||
|
||||
case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_BOTH_DIRECTORY_INFO\n"));
|
||||
was_8_3 = mangle_is_8_3(fname, True);
|
||||
p += 4;
|
||||
SIVAL(p,0,reskey); p += 4;
|
||||
@ -1012,12 +1051,15 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
put_long_date(p,adate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
SOFF_T(p,0,file_size);
|
||||
SOFF_T(p,8,allocation_size);
|
||||
p += 16;
|
||||
SOFF_T(p,0,file_size); p += 8;
|
||||
SOFF_T(p,0,allocation_size); p += 8;
|
||||
SIVAL(p,0,nt_extmode); p += 4;
|
||||
q = p; p += 4;
|
||||
SIVAL(p,0,0); p += 4;
|
||||
q = p; p += 4; /* q is placeholder for name length. */
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, NULL, pathreal);
|
||||
SIVAL(p,0,ea_size); /* Extended attributes */
|
||||
p += 4;
|
||||
}
|
||||
/* Clear the short name buffer. This is
|
||||
* IMPORTANT as not doing so will trigger
|
||||
* a Win2k client bug. JRA.
|
||||
@ -1045,20 +1087,19 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_FIND_FILE_DIRECTORY_INFO:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_DIRECTORY_INFO\n"));
|
||||
p += 4;
|
||||
SIVAL(p,0,reskey); p += 4;
|
||||
put_long_date(p,cdate); p += 8;
|
||||
put_long_date(p,adate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
SOFF_T(p,0,file_size);
|
||||
SOFF_T(p,8,allocation_size);
|
||||
p += 16;
|
||||
SOFF_T(p,0,file_size); p += 8;
|
||||
SOFF_T(p,0,allocation_size); p += 8;
|
||||
SIVAL(p,0,nt_extmode); p += 4;
|
||||
p += 4;
|
||||
len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(p, -4, len);
|
||||
p += len;
|
||||
len = srvstr_push(outbuf, p + 4, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(p,0,len);
|
||||
p += 4 + len;
|
||||
len = PTR_DIFF(p, pdata);
|
||||
len = (len + 3) & ~3;
|
||||
SIVAL(pdata,0,len);
|
||||
@ -1066,22 +1107,25 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_FULL_DIRECTORY_INFO\n"));
|
||||
p += 4;
|
||||
SIVAL(p,0,reskey); p += 4;
|
||||
put_long_date(p,cdate); p += 8;
|
||||
put_long_date(p,adate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
SOFF_T(p,0,file_size);
|
||||
SOFF_T(p,8,allocation_size);
|
||||
p += 16;
|
||||
SIVAL(p,0,nt_extmode);
|
||||
p += 4;
|
||||
|
||||
SIVAL(p,4,0); /* ea size */
|
||||
len = srvstr_push(outbuf, p+8, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(p, 0, len);
|
||||
p += 8 + len;
|
||||
SOFF_T(p,0,file_size); p += 8;
|
||||
SOFF_T(p,0,allocation_size); p += 8;
|
||||
SIVAL(p,0,nt_extmode); p += 4;
|
||||
q = p; p += 4; /* q is placeholder for name length. */
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, NULL, pathreal);
|
||||
SIVAL(p,0,ea_size); /* Extended attributes */
|
||||
p +=4;
|
||||
}
|
||||
len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(q, 0, len);
|
||||
p += len;
|
||||
|
||||
len = PTR_DIFF(p, pdata);
|
||||
len = (len + 3) & ~3;
|
||||
@ -1090,6 +1134,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_FIND_FILE_NAMES_INFO:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_NAMES_INFO\n"));
|
||||
p += 4;
|
||||
SIVAL(p,0,reskey); p += 4;
|
||||
p += 4;
|
||||
@ -1104,29 +1149,37 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
p = pdata + len;
|
||||
break;
|
||||
|
||||
case SMB_FIND_FILE_LEVEL_261:
|
||||
case SMB_FIND_ID_FULL_DIRECTORY_INFO:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_ID_FULL_DIRECTORY_INFO\n"));
|
||||
p += 4;
|
||||
SIVAL(p,0,reskey); p += 4;
|
||||
put_long_date(p,cdate); p += 8;
|
||||
put_long_date(p,adate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
SOFF_T(p,0,file_size);
|
||||
SOFF_T(p,8,allocation_size);
|
||||
p += 16;
|
||||
SIVAL(p,0,nt_extmode);
|
||||
p += 4;
|
||||
len = srvstr_push(outbuf, p + 20, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(p, 0, len);
|
||||
memset(p+4,'\0',16); /* EA size. Unknown 0 1 2 */
|
||||
p += 20 + len; /* Strlen, EA size. Unknown 0 1 2, string itself */
|
||||
SOFF_T(p,0,file_size); p += 8;
|
||||
SOFF_T(p,0,allocation_size); p += 8;
|
||||
SIVAL(p,0,nt_extmode); p += 4;
|
||||
q = p; p += 4; /* q is placeholder for name length. */
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, NULL, pathreal);
|
||||
SIVAL(p,0,ea_size); /* Extended attributes */
|
||||
p +=4;
|
||||
}
|
||||
SIVAL(p,0,0); p += 4; /* Unknown - reserved ? */
|
||||
SIVAL(p,0,sbuf.st_dev); p += 4;
|
||||
SIVAL(p,0,sbuf.st_ino); p += 4;
|
||||
len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(q, 0, len);
|
||||
p += len;
|
||||
len = PTR_DIFF(p, pdata);
|
||||
len = (len + 3) & ~3;
|
||||
SIVAL(pdata,0,len);
|
||||
p = pdata + len;
|
||||
break;
|
||||
|
||||
case SMB_FIND_FILE_LEVEL_262:
|
||||
case SMB_FIND_ID_BOTH_DIRECTORY_INFO:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_ID_BOTH_DIRECTORY_INFO\n"));
|
||||
was_8_3 = mangle_is_8_3(fname, True);
|
||||
p += 4;
|
||||
SIVAL(p,0,reskey); p += 4;
|
||||
@ -1134,12 +1187,15 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
put_long_date(p,adate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
put_long_date(p,mdate); p += 8;
|
||||
SOFF_T(p,0,file_size);
|
||||
SOFF_T(p,8,allocation_size);
|
||||
p += 16;
|
||||
SOFF_T(p,0,file_size); p += 8;
|
||||
SOFF_T(p,0,allocation_size); p += 8;
|
||||
SIVAL(p,0,nt_extmode); p += 4;
|
||||
q = p; p += 4;
|
||||
SIVAL(p,0,0); p += 4;
|
||||
q = p; p += 4; /* q is placeholder for name length */
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, NULL, pathreal);
|
||||
SIVAL(p,0,ea_size); /* Extended attributes */
|
||||
p +=4;
|
||||
}
|
||||
/* Clear the short name buffer. This is
|
||||
* IMPORTANT as not doing so will trigger
|
||||
* a Win2k client bug. JRA.
|
||||
@ -1156,9 +1212,10 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
SSVAL(p,0,0);
|
||||
*(p+2) = 0;
|
||||
}
|
||||
p += 2 + 24;
|
||||
memset(p, '\0', 10); /* 2 4 byte unknowns plus a zero reserved. */
|
||||
p += 10;
|
||||
p += 26;
|
||||
SSVAL(p,0,0); p += 2; /* Reserved ? */
|
||||
SIVAL(p,0,sbuf.st_dev); p += 4;
|
||||
SIVAL(p,0,sbuf.st_ino); p += 4;
|
||||
len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);
|
||||
SIVAL(q,0,len);
|
||||
p += len;
|
||||
@ -1171,6 +1228,7 @@ static BOOL get_lanman2_dir_entry(connection_struct *conn,
|
||||
/* CIFS UNIX Extension. */
|
||||
|
||||
case SMB_FIND_FILE_UNIX:
|
||||
DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_UNIX\n"));
|
||||
p+= 4;
|
||||
SIVAL(p,0,reskey); p+= 4; /* Used for continuing search. */
|
||||
|
||||
@ -1301,8 +1359,8 @@ close_if_end = %d requires_resume_key = %d level = %d, max_data_bytes = %d\n",
|
||||
case SMB_FIND_FILE_FULL_DIRECTORY_INFO:
|
||||
case SMB_FIND_FILE_NAMES_INFO:
|
||||
case SMB_FIND_FILE_BOTH_DIRECTORY_INFO:
|
||||
case SMB_FIND_FILE_LEVEL_261:
|
||||
case SMB_FIND_FILE_LEVEL_262:
|
||||
case SMB_FIND_ID_FULL_DIRECTORY_INFO:
|
||||
case SMB_FIND_ID_BOTH_DIRECTORY_INFO:
|
||||
break;
|
||||
case SMB_FIND_FILE_UNIX:
|
||||
if (!lp_unix_extensions())
|
||||
@ -2356,18 +2414,33 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
|
||||
switch (info_level) {
|
||||
case SMB_INFO_STANDARD:
|
||||
case SMB_INFO_QUERY_EA_SIZE:
|
||||
data_size = (info_level==1?22:26);
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_INFO_STANDARD\n"));
|
||||
data_size = 22;
|
||||
put_dos_date2(pdata,l1_fdateCreation,c_time);
|
||||
put_dos_date2(pdata,l1_fdateLastAccess,sbuf.st_atime);
|
||||
put_dos_date2(pdata,l1_fdateLastWrite,sbuf.st_mtime); /* write time */
|
||||
SIVAL(pdata,l1_cbFile,(uint32)file_size);
|
||||
SIVAL(pdata,l1_cbFileAlloc,(uint32)allocation_size);
|
||||
SSVAL(pdata,l1_attrFile,mode);
|
||||
SIVAL(pdata,l1_attrFile+2,0); /* this is what win2003 does */
|
||||
break;
|
||||
|
||||
case SMB_INFO_QUERY_EA_SIZE:
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, fsp, fname);
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_INFO_QUERY_EA_SIZE\n"));
|
||||
data_size = 26;
|
||||
put_dos_date2(pdata,l1_fdateCreation,c_time);
|
||||
put_dos_date2(pdata,l1_fdateLastAccess,sbuf.st_atime);
|
||||
put_dos_date2(pdata,l1_fdateLastWrite,sbuf.st_mtime); /* write time */
|
||||
SIVAL(pdata,l1_cbFile,(uint32)file_size);
|
||||
SIVAL(pdata,l1_cbFileAlloc,(uint32)allocation_size);
|
||||
SSVAL(pdata,l1_attrFile,mode);
|
||||
SIVAL(pdata,l1_attrFile+2,ea_size);
|
||||
break;
|
||||
}
|
||||
|
||||
case SMB_INFO_IS_NAME_VALID:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_INFO_IS_NAME_VALID\n"));
|
||||
if (tran_call == TRANSACT2_QFILEINFO) {
|
||||
/* os/2 needs this ? really ?*/
|
||||
return ERROR_DOS(ERRDOS,ERRbadfunc);
|
||||
@ -2377,6 +2450,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_INFO_QUERY_EAS_FROM_LIST:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_INFO_QUERY_EAS_FROM_LIST\n"));
|
||||
data_size = 24;
|
||||
put_dos_date2(pdata,0,c_time);
|
||||
put_dos_date2(pdata,4,sbuf.st_atime);
|
||||
@ -2387,6 +2461,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_INFO_QUERY_ALL_EAS:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_INFO_QUERY_ALL_EAS\n"));
|
||||
/* We have data_size bytes to put EA's into. */
|
||||
data_size = fill_ea_buffer(pdata, data_size, conn, fsp, fname);
|
||||
break;
|
||||
@ -2394,9 +2469,11 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
case SMB_FILE_BASIC_INFORMATION:
|
||||
case SMB_QUERY_FILE_BASIC_INFO:
|
||||
|
||||
if (info_level == SMB_QUERY_FILE_BASIC_INFO)
|
||||
if (info_level == SMB_QUERY_FILE_BASIC_INFO) {
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_QUERY_FILE_BASIC_INFO\n"));
|
||||
data_size = 36; /* w95 returns 40 bytes not 36 - why ?. */
|
||||
else {
|
||||
} else {
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_BASIC_INFORMATION\n"));
|
||||
data_size = 40;
|
||||
SIVAL(pdata,36,0);
|
||||
}
|
||||
@ -2421,6 +2498,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
case SMB_FILE_STANDARD_INFORMATION:
|
||||
case SMB_QUERY_FILE_STANDARD_INFO:
|
||||
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_STANDARD_INFORMATION\n"));
|
||||
data_size = 24;
|
||||
SOFF_T(pdata,0,allocation_size);
|
||||
SOFF_T(pdata,8,file_size);
|
||||
@ -2436,6 +2514,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
case SMB_QUERY_FILE_EA_INFO:
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, fsp, fname);
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_EA_INFORMATION\n"));
|
||||
data_size = 4;
|
||||
SIVAL(pdata,0,ea_size);
|
||||
break;
|
||||
@ -2447,6 +2526,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
{
|
||||
pstring short_name;
|
||||
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ALTERNATE_NAME_INFORMATION\n"));
|
||||
pstrcpy(short_name,base_name);
|
||||
/* Mangle if not already 8.3 */
|
||||
if(!mangle_is_8_3(short_name, True)) {
|
||||
@ -2463,24 +2543,30 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
this must be *exactly* right for ACLs on mapped drives to work
|
||||
*/
|
||||
len = srvstr_push(outbuf, pdata+4, dos_fname, -1, STR_UNICODE);
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_QUERY_FILE_NAME_INFO\n"));
|
||||
data_size = 4 + len;
|
||||
SIVAL(pdata,0,len);
|
||||
break;
|
||||
|
||||
case SMB_FILE_ALLOCATION_INFORMATION:
|
||||
case SMB_QUERY_FILE_ALLOCATION_INFO:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ALLOCATION_INFORMATION\n"));
|
||||
data_size = 8;
|
||||
SOFF_T(pdata,0,allocation_size);
|
||||
break;
|
||||
|
||||
case SMB_FILE_END_OF_FILE_INFORMATION:
|
||||
case SMB_QUERY_FILE_END_OF_FILEINFO:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_END_OF_FILE_INFORMATION\n"));
|
||||
data_size = 8;
|
||||
SOFF_T(pdata,0,file_size);
|
||||
break;
|
||||
|
||||
case SMB_QUERY_FILE_ALL_INFO:
|
||||
case SMB_FILE_ALL_INFORMATION:
|
||||
{
|
||||
unsigned int ea_size = estimate_ea_size(conn, fsp, fname);
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ALL_INFORMATION\n"));
|
||||
put_long_date(pdata,c_time);
|
||||
put_long_date(pdata+8,sbuf.st_atime);
|
||||
put_long_date(pdata+16,sbuf.st_mtime); /* write time */
|
||||
@ -2496,13 +2582,14 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
SCVAL(pdata,20,delete_pending);
|
||||
SCVAL(pdata,21,(mode&aDIR)?1:0);
|
||||
pdata += 24;
|
||||
SIVAL(pdata,0,ea_size);
|
||||
pdata += 4; /* EA info */
|
||||
len = srvstr_push(outbuf, pdata+4, dos_fname, -1, STR_UNICODE);
|
||||
SIVAL(pdata,0,len);
|
||||
pdata += 4 + len;
|
||||
data_size = PTR_DIFF(pdata,(*ppdata));
|
||||
break;
|
||||
|
||||
}
|
||||
case SMB_FILE_INTERNAL_INFORMATION:
|
||||
/* This should be an index number - looks like
|
||||
dev/ino to me :-)
|
||||
@ -2510,12 +2597,14 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
I think this causes us to fail the IFSKIT
|
||||
BasicFileInformationTest. -tpot */
|
||||
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_INTERNAL_INFORMATION\n"));
|
||||
SIVAL(pdata,0,sbuf.st_dev);
|
||||
SIVAL(pdata,4,sbuf.st_ino);
|
||||
data_size = 8;
|
||||
break;
|
||||
|
||||
case SMB_FILE_ACCESS_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ACCESS_INFORMATION\n"));
|
||||
SIVAL(pdata,0,desired_access);
|
||||
data_size = 4;
|
||||
break;
|
||||
@ -2525,27 +2614,32 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
{
|
||||
size_t byte_len;
|
||||
byte_len = dos_PutUniCode(pdata+4,dos_fname,max_data_bytes,False);
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_NAME_INFORMATION\n"));
|
||||
SIVAL(pdata,0,byte_len);
|
||||
data_size = 4 + byte_len;
|
||||
break;
|
||||
}
|
||||
|
||||
case SMB_FILE_DISPOSITION_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_DISPOSITION_INFORMATION\n"));
|
||||
data_size = 1;
|
||||
SCVAL(pdata,0,delete_pending);
|
||||
break;
|
||||
|
||||
case SMB_FILE_POSITION_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_POSITION_INFORMATION\n"));
|
||||
data_size = 8;
|
||||
SOFF_T(pdata,0,pos);
|
||||
break;
|
||||
|
||||
case SMB_FILE_MODE_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_MODE_INFORMATION\n"));
|
||||
SIVAL(pdata,0,mode);
|
||||
data_size = 4;
|
||||
break;
|
||||
|
||||
case SMB_FILE_ALIGNMENT_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ALIGNMENT_INFORMATION\n"));
|
||||
SIVAL(pdata,0,0); /* No alignment needed. */
|
||||
data_size = 4;
|
||||
break;
|
||||
@ -2559,6 +2653,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
case SMB_QUERY_FILE_STREAM_INFO:
|
||||
#endif
|
||||
case SMB_FILE_STREAM_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_STREAM_INFORMATION\n"));
|
||||
if (mode & aDIR) {
|
||||
data_size = 0;
|
||||
} else {
|
||||
@ -2574,6 +2669,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
|
||||
case SMB_QUERY_COMPRESSION_INFO:
|
||||
case SMB_FILE_COMPRESSION_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_COMPRESSION_INFORMATION\n"));
|
||||
SOFF_T(pdata,0,file_size);
|
||||
SIVAL(pdata,8,0); /* ??? */
|
||||
SIVAL(pdata,12,0); /* ??? */
|
||||
@ -2581,6 +2677,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_FILE_NETWORK_OPEN_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_NETWORK_OPEN_INFORMATION\n"));
|
||||
put_long_date(pdata,c_time);
|
||||
put_long_date(pdata+8,sbuf.st_atime);
|
||||
put_long_date(pdata+16,sbuf.st_mtime); /* write time */
|
||||
@ -2593,6 +2690,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
break;
|
||||
|
||||
case SMB_FILE_ATTRIBUTE_TAG_INFORMATION:
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_FILE_ATTRIBUTE_TAG_INFORMATION\n"));
|
||||
SIVAL(pdata,0,mode);
|
||||
SIVAL(pdata,4,0);
|
||||
data_size = 8;
|
||||
@ -2604,6 +2702,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
|
||||
case SMB_QUERY_FILE_UNIX_BASIC:
|
||||
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_QUERY_FILE_UNIX_BASIC\n"));
|
||||
DEBUG(4,("call_trans2qfilepathinfo: st_mode=%o\n",(int)sbuf.st_mode));
|
||||
|
||||
SOFF_T(pdata,0,get_file_size(sbuf)); /* File size 64 Bit */
|
||||
@ -2663,6 +2762,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
|
||||
{
|
||||
pstring buffer;
|
||||
|
||||
DEBUG(10,("call_trans2qfilepathinfo: SMB_QUERY_FILE_UNIX_LINK\n"));
|
||||
#ifdef S_ISLNK
|
||||
if(!S_ISLNK(sbuf.st_mode))
|
||||
return(UNIXERROR(ERRSRV,ERRbadlink));
|
||||
|
Reference in New Issue
Block a user