1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

ipc.c: Changed reply_trans to use receive_next_smb() to cope

with local message processing.
reply.c: Added check to reply_lockingX for chain after oplock break.
server.c: Added receive_next_smb().
trans2.c: Changed reply_trans2 to use receive_next_smb() to cope
       with local message processing.
(This used to be commit f4ae644e13)
This commit is contained in:
Jeremy Allison 1997-11-18 23:30:49 +00:00
parent eb97fc7d5a
commit 689ed3481d
5 changed files with 61 additions and 9 deletions

View File

@ -172,7 +172,7 @@ struct in_addr *iface_ip(struct in_addr ip);
/*The following definitions come from ipc.c */
int get_printerdrivernumber(int snum);
int reply_trans(char *inbuf,char *outbuf);
int reply_trans(char *inbuf,char *outbuf, int size, int bufsize);
/*The following definitions come from kanji.c */
@ -1071,6 +1071,7 @@ int error_packet(char *inbuf,char *outbuf,int error_class,uint32 error_code,int
BOOL oplock_break(uint32 dev, uint32 inode, struct timeval *tval);
BOOL request_oplock_break(share_mode_entry *share_entry,
uint32 dev, uint32 inode);
BOOL receive_next_smb(int smbfd, int oplockfd, char *inbuf, int bufsize, int timeout);
BOOL snum_used(int snum);
BOOL reload_services(BOOL test);
int setup_groups(char *user, int uid, int gid, int *p_ngroups,

View File

@ -62,6 +62,8 @@ extern fstring myworkgroup;
#define QNLEN 12 /* queue name maximum length */
extern int Client;
extern int oplock_sock;
extern int smb_read_error;
static BOOL api_Unsupported(int cnum,uint16 vuid, char *param,char *data,
int mdrcnt,int mprcnt,
@ -3203,7 +3205,7 @@ static int named_pipe(int cnum,uint16 vuid, char *outbuf,char *name,
/****************************************************************************
reply to a SMBtrans
****************************************************************************/
int reply_trans(char *inbuf,char *outbuf)
int reply_trans(char *inbuf,char *outbuf, int size, int bufsize)
{
fstring name;
@ -3266,12 +3268,18 @@ int reply_trans(char *inbuf,char *outbuf)
/* receive the rest of the trans packet */
while (pscnt < tpscnt || dscnt < tdscnt)
{
BOOL ret;
int pcnt,poff,dcnt,doff,pdisp,ddisp;
if (!receive_smb(Client,inbuf, SMB_SECONDARY_WAIT) ||
CVAL(inbuf, smb_com) != SMBtrans)
ret = receive_next_smb(Client,oplock_sock,inbuf,bufsize,SMB_SECONDARY_WAIT);
if ((ret && (CVAL(inbuf, smb_com) != SMBtrans)) || !ret)
{
DEBUG(2,("Invalid secondary trans2 packet\n"));
if(ret)
DEBUG(0,("reply_trans: Invalid secondary trans packet\n"));
else
DEBUG(0,("reply_trans: %s in getting secondary trans response.\n",
(smb_read_error == READ_ERROR) ? "error" : "timeout" ));
if (params) free(params);
if (data) free(data);
if (setup) free(setup);

View File

@ -3495,7 +3495,14 @@ dev = %x, inode = %x\n",
/* if this is a pure oplock break request then don't send a reply */
if (num_locks == 0 && num_ulocks == 0)
return -1;
{
/* Sanity check - ensure a pure oplock break is not a
chained request. */
if(CVAL(inbuf,smb_vwv0) != 0xff)
DEBUG(0,("reply_lockingX: Error : pure oplock break is a chained %d request !\n",
(unsigned int)CVAL(inbuf,smb_vwv0) ));
return -1;
}
}
/* Data now points at the beginning of the list

View File

@ -3086,6 +3086,32 @@ oplock break response from pid %d on port %d for dev = %x, inode = %x.\n",
return True;
}
/****************************************************************************
Get the next SMB packet, doing the local message processing automatically.
****************************************************************************/
BOOL receive_next_smb(int smbfd, int oplockfd, char *inbuf, int bufsize, int timeout)
{
BOOL got_smb = False;
BOOL ret;
do
{
ret = receive_message_or_smb(smbfd,oplockfd,inbuf,bufsize,
timeout,&got_smb);
if(ret && !got_smb)
{
/* Deal with oplock break requests from other smbd's. */
process_local_message(oplock_sock, inbuf, bufsize);
continue;
}
}
while(ret && !got_smb);
return ret;
}
/****************************************************************************
check if a snum is in use
****************************************************************************/

View File

@ -30,6 +30,8 @@ extern connection_struct Connections[];
extern files_struct Files[];
extern BOOL case_sensitive;
extern int Client;
extern int oplock_sock;
extern int smb_read_error;
/****************************************************************************
Send the required number of replies back.
@ -1702,11 +1704,19 @@ int reply_trans2(char *inbuf,char *outbuf,int length,int bufsize)
while( num_data_sofar < total_data || num_params_sofar < total_params)
{
if(!receive_smb(Client,inbuf, SMB_SECONDARY_WAIT) ||
CVAL(inbuf, smb_com) != SMBtranss2)
BOOL ret;
ret = receive_next_smb(Client,oplock_sock,inbuf,bufsize,
SMB_SECONDARY_WAIT);
if((ret && (CVAL(inbuf, smb_com) != SMBtranss2)) || !ret)
{
outsize = set_message(outbuf,0,0,True);
DEBUG(2,("Invalid secondary trans2 packet\n"));
if(ret)
DEBUG(0,("reply_trans2: Invalid secondary trans2 packet\n"));
else
DEBUG(0,("reply_trans2: %s in getting secondary trans2 response.\n",
(smb_read_error == READ_ERROR) ? "error" : "timeout" ));
free(params);
free(data);
return(ERROR(ERRSRV,ERRerror));