1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

r21049: Start to refactor some of the setpath set code

into separate functions (tridge mailed me a fresh
batch) to make it easier to add the POSIX open we'll
need soon.
Jeremy.
(This used to be commit 63bd8759fefe6af80186ab15b470658614690b48)
This commit is contained in:
Jeremy Allison 2007-01-30 01:14:48 +00:00 committed by Gerald (Jerry) Carter
parent 6beb519280
commit 1e753db3d4

View File

@ -3742,7 +3742,69 @@ NTSTATUS hardlink_internals(connection_struct *conn, char *oldname, char *newnam
}
/****************************************************************************
Reply to a TRANS2_SETFILEINFO (set file info by fileid).
Deal with SMB_INFO_SET_EA.
****************************************************************************/
static int smb_info_set_ea(connection_struct *conn,
char *outbuf,
int bufsize,
char *params,
int total_params,
char *pdata,
int total_data,
unsigned int max_data_bytes,
files_struct *fsp,
const char *fname)
{
struct ea_list *ea_list = NULL;
TALLOC_CTX *ctx = NULL;
NTSTATUS status = NT_STATUS_OK;
if (total_data < 10) {
/* OS/2 workplace shell seems to send SET_EA requests of "null"
length. They seem to have no effect. Bug #3212. JRA */
if ((total_data == 4) && (IVAL(pdata,0) == 4)) {
/* We're done. We only get EA info in this call. */
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
return -1;
}
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
if (IVAL(pdata,0) > total_data) {
DEBUG(10,("smb_info_set_ea: bad total data size (%u) > %u\n",
IVAL(pdata,0), (unsigned int)total_data));
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
ctx = talloc_init("SMB_INFO_SET_EA");
if (!ctx) {
return ERROR_NT(NT_STATUS_NO_MEMORY);
}
ea_list = read_ea_list(ctx, pdata + 4, total_data - 4);
if (!ea_list) {
talloc_destroy(ctx);
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
status = set_ea(conn, fsp, fname, ea_list);
talloc_destroy(ctx);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
/* We're done. We only get EA info in this call. */
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, pdata, 0, max_data_bytes);
return -1;
}
/****************************************************************************
Reply to a TRANS2_SETFILEINFO (set file info by fileid or pathname).
****************************************************************************/
static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char *outbuf, int length, int bufsize,
@ -3901,79 +3963,16 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
}
case SMB_INFO_SET_EA:
{
struct ea_list *ea_list = NULL;
TALLOC_CTX *ctx = NULL;
if (total_data < 10) {
/* OS/2 workplace shell seems to send SET_EA requests of "null"
length. They seem to have no effect. Bug #3212. JRA */
if ((total_data == 4) && (IVAL(pdata,0) == 4)) {
/* We're done. We only get EA info in this call. */
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0, max_data_bytes);
return(-1);
}
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
if (IVAL(pdata,0) > total_data) {
DEBUG(10,("call_trans2setfilepathinfo: bad total data size (%u) > %u\n",
IVAL(pdata,0), (unsigned int)total_data));
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
ctx = talloc_init("SMB_INFO_SET_EA");
if (!ctx) {
return ERROR_NT(NT_STATUS_NO_MEMORY);
}
ea_list = read_ea_list(ctx, pdata + 4, total_data - 4);
if (!ea_list) {
talloc_destroy(ctx);
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
}
status = set_ea(conn, fsp, fname, ea_list);
talloc_destroy(ctx);
if (!NT_STATUS_IS_OK(status)) {
return ERROR_NT(status);
}
/* We're done. We only get EA info in this call. */
SSVAL(params,0,0);
send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0, max_data_bytes);
return(-1);
}
#if 0
/* The following 2 info levels are only valid on query, not set. Remove them. JRA. */
/* XXXX um, i don't think this is right.
it's also not in the cifs6.txt spec.
*/
case SMB_INFO_QUERY_EAS_FROM_LIST:
if (total_data < 28)
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
tvs.actime = make_unix_date2(pdata+8);
tvs.modtime = make_unix_date2(pdata+12);
size = IVAL(pdata,16);
dosmode = IVAL(pdata,24);
break;
/* XXXX nor this. not in cifs6.txt, either. */
case SMB_INFO_QUERY_ALL_EAS:
if (total_data < 28)
return ERROR_NT(NT_STATUS_INVALID_PARAMETER);
tvs.actime = make_unix_date2(pdata+8);
tvs.modtime = make_unix_date2(pdata+12);
size = IVAL(pdata,16);
dosmode = IVAL(pdata,24);
break;
#endif
return smb_info_set_ea(conn,
outbuf,
bufsize,
params,
total_params,
*ppdata,
total_data,
max_data_bytes,
fsp,
fname);
case SMB_SET_FILE_BASIC_INFO:
case SMB_FILE_BASIC_INFORMATION: