SIVALS(outbuf,smb_vwv1, -1);
send_smb(clnt_fd, outbuf);
- receive_smb(clnt_fd,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(clnt_fd,inbuf,CLIENT_TIMEOUT);
}
/****************************************************************************
#endif
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (report && CVAL(inbuf,smb_rcls) != 0)
DEBUG(2,("chkpath: %s\n",smb_errstr(inbuf)));
send_smb(Client,outbuf);
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
+ if (!client_receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
{
printf("SMBsendstrt failed. (%s)\n",smb_errstr(inbuf));
return;
send_smb(Client,outbuf);
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
+ if (!client_receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
{
printf("SMBsendtxt failed (%s)\n",smb_errstr(inbuf));
return;
send_smb(Client,outbuf);
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
+ if (!client_receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
{
printf("SMBsendend failed (%s)\n",smb_errstr(inbuf));
return;
cli_setup_pkt(outbuf);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
DEBUG(0,("Error in dskattr: %s\n",smb_errstr(inbuf)));
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
received = SVAL(inbuf,smb_vwv0);
memcpy(p,status,21);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
DEBUG(0,("Error closing search: %s\n",smb_errstr(inbuf)));
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SSVAL(outbuf,smb_vwv4,finfo.size - nread);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
*p++ = 4;
*p = 0;
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
}
{
strcpy(p,name);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
send_smb(Client,outbuf);
- if (!receive_smb(Client,inbuf,CLIENT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
+ if (!client_receive_smb(Client,inbuf,CLIENT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
return(0);
_smb_setlen(buf-4,n); /* HACK! XXXX */
if (write_socket(Client,buf-4,n+4) != n+4)
return(0);
- if (!receive_smb(Client,inbuf,CLIENT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0) {
+ if (!client_receive_smb(Client,inbuf,CLIENT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0) {
DEBUG(0,("Error writing remote file (2)\n"));
return(0);
}
memcpy(smb_buf(outbuf)+3,buf,n);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0) {
DEBUG(0,("%s writing remote file\n",smb_errstr(inbuf)));
strcpy(p,rname);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
put_dos_date3(outbuf,smb_vwv1,close_time);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
strcpy(p,rname);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SSVAL(smb_buf(outbuf),1,n);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SSVAL(outbuf,smb_vwv0,fnum);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SSVAL(outbuf,smb_vwv1,0); /* the index into the queue */
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
strcpy(p,mask);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
DEBUG(0,("%s deleting remote file %s\n",smb_errstr(inbuf),CNV_LANG(mask)));
strcpy(p,mask);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
strcpy(p,dest);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
}
}
#endif
+
+ /* We deliberately use receive_smb instead of
+ client_receive_smb as we want to receive
+ session keepalives and then drop them here.
+ */
if (FD_ISSET(Client,&fds))
receive_smb(Client,buffer,0);
*data_len = *param_len = 0;
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
show_msg(inbuf);
/* sanity check */
if (total_data <= *data_len && total_param <= *param_len)
break;
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
show_msg(inbuf);
/* sanity check */
if (this_ldata < ldata || this_lparam < lparam)
{
/* receive interim response */
- if (!receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
+ if (!client_receive_smb(Client,inbuf,SHORT_TIMEOUT) || CVAL(inbuf,smb_rcls) != 0)
{
DEBUG(0,("%s request failed (%s)\n",
trans==SMBtrans?"SMBtrans":"SMBtrans2", smb_errstr(inbuf)));
send_smb(Client,outbuf);
DEBUG(5,("Sent session request\n"));
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,0) == 0x84) /* C. Hoch 9/14/95 Start */
{
CVAL(smb_buf(outbuf),0) = 2;
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
show_msg(inbuf);
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
show_msg(inbuf);
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
/* trying again with a blank password */
if (CVAL(inbuf,smb_rcls) != 0 &&
cli_setup_pkt(outbuf);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,SHORT_TIMEOUT);
+ client_receive_smb(Client,inbuf,SHORT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
cli_setup_pkt(outbuf);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,SHORT_TIMEOUT);
+ client_receive_smb(Client,inbuf,SHORT_TIMEOUT);
close_sockets();
if (!cli_open_sockets(0)) return(False);
*p++ = 0;
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
DEBUG(5,("getatr: %s\n",smb_errstr(inbuf)));
*p++ = 0;
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
strcpy(p,finfo.name);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SSVAL(smb_buf(outbuf),1,n);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
finfo.mtime));
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
strcpy(p,fname);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
DEBUG(5,("smbchkpath: %s\n",smb_errstr(inbuf)));
strcpy(p,fname);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
}
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SSVAL(outbuf,smb_vwv4,finfo.size - nread);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (CVAL(inbuf,smb_rcls) != 0)
{
SIVALS(outbuf,smb_vwv1,-1);
send_smb(Client,outbuf);
- receive_smb(Client,inbuf,CLIENT_TIMEOUT);
+ client_receive_smb(Client,inbuf,CLIENT_TIMEOUT);
if (!ignore_close_error && CVAL(inbuf,smb_rcls) != 0)
{
int transfer_file(int infd,int outfd,int n,char *header,int headlen,int align);
int read_smb_length(int fd,char *inbuf,int timeout);
BOOL receive_smb(int fd,char *buffer, int timeout);
+BOOL client_receive_smb(int fd,char *buffer, int timeout);
BOOL receive_local_message(int fd, char *buffer, int buffer_len, int timeout);
BOOL push_local_message(char *buf, int msg_len);
BOOL receive_message_or_smb(int smbfd, int oplock_fd,
/****************************************************************************
read 4 bytes of a smb packet and return the smb length of the packet
-possibly store the result in the buffer
+store the result in the buffer
+This version of the function will return a length of zero on receiving
+a keepalive packet.
****************************************************************************/
-int read_smb_length(int fd,char *inbuf,int timeout)
+static int read_smb_length_return_keepalive(int fd,char *inbuf,int timeout)
{
- char *buffer;
- char buf[4];
int len=0, msg_type;
BOOL ok=False;
- if (inbuf)
- buffer = inbuf;
- else
- buffer = buf;
-
while (!ok)
{
if (timeout > 0)
- ok = (read_with_timeout(fd,buffer,4,4,timeout) == 4);
+ ok = (read_with_timeout(fd,inbuf,4,4,timeout) == 4);
else
- ok = (read_data(fd,buffer,4) == 4);
+ ok = (read_data(fd,inbuf,4) == 4);
if (!ok)
return(-1);
- len = smb_len(buffer);
- msg_type = CVAL(buffer,0);
+ len = smb_len(inbuf);
+ msg_type = CVAL(inbuf,0);
if (msg_type == 0x85)
DEBUG(5,("Got keepalive packet\n"));
return(len);
}
+/****************************************************************************
+read 4 bytes of a smb packet and return the smb length of the packet
+store the result in the buffer. This version of the function will
+never return a session keepalive (length of zero).
+****************************************************************************/
+int read_smb_length(int fd,char *inbuf,int timeout)
+{
+ int len;
+
+ for(;;)
+ {
+ len = read_smb_length(fd, inbuf, timeout);
+
+ if(len < 0)
+ return len;
+ /* Ignore session keepalives. */
+ if(CVAL(inbuf,0) != 0x85)
+ break;
+ }
+
+ return len;
+}
/****************************************************************************
read an smb from a fd. Note that the buffer *MUST* be of size
BUFFER_SIZE+SAFETY_MARGIN.
-The timeout is in milli seconds
+ The timeout is in milli seconds.
+
+ This function will return on a
+ receipt of a session keepalive packet.
****************************************************************************/
BOOL receive_smb(int fd,char *buffer, int timeout)
{
bzero(buffer,smb_size + 100);
- len = read_smb_length(fd,buffer,timeout);
+ len = read_smb_length_return_keepalive(fd,buffer,timeout);
if (len < 0)
return(False);
return(True);
}
+/****************************************************************************
+ read an smb from a fd ignoring all keepalive packets. Note that the buffer
+ *MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
+ The timeout is in milli seconds
+
+ This is exactly the same as receive_smb except that it never returns
+ a session keepalive packet (just as receive_smb used to do).
+ receive_smb was changed to return keepalives as the oplock processing means this call
+ should never go into a blocking read.
+****************************************************************************/
+
+BOOL client_receive_smb(int fd,char *buffer, int timeout)
+{
+ BOOL ret;
+
+ for(;;)
+ {
+ ret = receive_smb(fd, buffer, timeout);
+
+ if(ret == False)
+ return ret;
+
+ /* Ignore session keepalive packets. */
+ if(CVAL(buffer,0) != 0x85)
+ break;
+ }
+ return ret;
+}
+
/****************************************************************************
read a message from a udp fd.
The timeout is in milli seconds
if (this_ldata < ldata || this_lparam < lparam) {
/* receive interim response */
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout) ||
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout) ||
CVAL(cli->inbuf,smb_rcls) != 0) {
return(False);
}
*data_len = *param_len = 0;
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
show_msg(cli->inbuf);
if (total_data <= *data_len && total_param <= *param_len)
break;
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
show_msg(cli->inbuf);
}
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
show_msg(cli->inbuf);
SCVAL(cli->inbuf,smb_rcls, 1);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
if (CVAL(cli->inbuf,smb_rcls) != 0) {
cli_setup_packet(cli);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
return CVAL(cli->inbuf,smb_rcls) == 0;
strcpy(p,fname_dst);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
strcpy(p,fname);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
strcpy(p,dname);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
strcpy(p,dname);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
p = skip_string(p,1);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return -1;
}
SIVALS(cli->outbuf,smb_vwv1,-1);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
SIVAL(p, 6, len);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
SIVAL(p, 6, len);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
SSVAL(cli->outbuf,smb_vwv6,size);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return -1;
}
memcpy(p, buf, size);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return -1;
}
strcpy(p+1, fname);
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
*p = 4;
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
return False;
}
CVAL(smb_buf(cli->outbuf),0) = 2;
send_smb(cli->fd,cli->outbuf);
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
show_msg(cli->inbuf);
send_smb(cli->fd,cli->outbuf);
DEBUG(5,("Sent session request\n"));
- if (!receive_smb(cli->fd,cli->inbuf,cli->timeout))
+ if (!client_receive_smb(cli->fd,cli->inbuf,cli->timeout))
return False;
if (CVAL(cli->inbuf,0) != 0x82) {