1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-28 07:21:54 +03:00

First cut at fix for the EINTR problem... More needs to be done I think.

Jeremy.
(This used to be commit 48475a7a69)
This commit is contained in:
Jeremy Allison 2002-04-19 02:08:52 +00:00
parent dcb572e0b2
commit 302b581ddc
4 changed files with 187 additions and 141 deletions

View File

@ -72,6 +72,51 @@ int sys_usleep(long usecs)
#endif /* HAVE_USLEEP */
}
/*******************************************************************
A read wrapper that will deal with EINTR.
********************************************************************/
ssize_t sys_read(int fd, void *buf, size_t count)
{
ssize_t ret;
do {
errno = 0;
ret = read(fd, buf, count);
} while (ret == -1 && errno == EINTR);
return ret;
}
/*******************************************************************
A write wrapper that will deal with EINTR.
********************************************************************/
ssize_t sys_write(int fd, const void *buf, size_t count)
{
ssize_t ret;
do {
errno = 0;
ret = write(fd, buf, count);
} while (ret == -1 && errno == EINTR);
return ret;
}
/*******************************************************************
A send wrapper that will deal with EINTR.
********************************************************************/
int sys_send(int s, const void *msg, size_t len, int flags)
{
ssize_t ret;
do {
errno = 0;
ret = send(s, msg, len, flags);
} while (ret == -1 && errno == EINTR);
return ret;
}
/*******************************************************************
A stat() wrapper that will deal with 64 bit filesizes.
********************************************************************/

View File

@ -1353,11 +1353,12 @@ BOOL fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
lock.l_len = count;
lock.l_pid = 0;
errno = 0;
do {
errno = 0;
ret = fcntl(fd,op,&lock);
} while (ret == -1 && errno == EINTR);
ret = fcntl(fd,op,&lock);
if (errno != 0)
if (ret == -1 && errno != 0)
DEBUG(3,("fcntl_lock: fcntl lock gave errno %d (%s)\n",errno,strerror(errno)));
/* a lock query */

View File

@ -247,10 +247,10 @@ static ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t ma
if (fd == sslFd) {
readret = SSL_read(ssl, buf + nread, maxcnt - nread);
} else {
readret = read(fd, buf + nread, maxcnt - nread);
readret = sys_read(fd, buf + nread, maxcnt - nread);
}
#else /* WITH_SSL */
readret = read(fd, buf + nread, maxcnt - nread);
readret = sys_read(fd, buf + nread, maxcnt - nread);
#endif /* WITH_SSL */
if (readret == 0) {
@ -304,10 +304,10 @@ static ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t ma
if (fd == sslFd) {
readret = SSL_read(ssl, buf + nread, maxcnt - nread);
}else{
readret = read(fd, buf + nread, maxcnt - nread);
readret = sys_read(fd, buf + nread, maxcnt - nread);
}
#else /* WITH_SSL */
readret = read(fd, buf+nread, maxcnt-nread);
readret = sys_read(fd, buf+nread, maxcnt-nread);
#endif /* WITH_SSL */
if (readret == 0) {
@ -357,10 +357,10 @@ ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt,
if(fd == sslFd){
readret = SSL_read(ssl, buf + nread, maxcnt - nread);
}else{
readret = read(fd, buf + nread, maxcnt - nread);
readret = sys_read(fd, buf + nread, maxcnt - nread);
}
#else /* WITH_SSL */
readret = read(fd, buf + nread, maxcnt - nread);
readret = sys_read(fd, buf + nread, maxcnt - nread);
#endif /* WITH_SSL */
if (readret <= 0)
@ -387,10 +387,10 @@ ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt,
if(fd == sslFd){
readret = SSL_read(ssl, buf + nread, maxcnt - nread);
}else{
readret = read(fd, buf + nread, maxcnt - nread);
readret = sys_read(fd, buf + nread, maxcnt - nread);
}
#else /* WITH_SSL */
readret = read(fd, buf+nread, maxcnt-nread);
readret = sys_read(fd, buf+nread, maxcnt-nread);
#endif /* WITH_SSL */
if (readret <= 0)
@ -409,12 +409,12 @@ send a keepalive packet (rfc1002)
BOOL send_keepalive(int client)
{
unsigned char buf[4];
unsigned char buf[4];
buf[0] = SMBkeepalive;
buf[1] = buf[2] = buf[3] = 0;
buf[0] = SMBkeepalive;
buf[1] = buf[2] = buf[3] = 0;
return(write_socket_data(client,(char *)buf,4) == 4);
return(write_socket_data(client,(char *)buf,4) == 4);
}
/****************************************************************************
@ -423,38 +423,36 @@ BOOL send_keepalive(int client)
ssize_t read_data(int fd,char *buffer,size_t N)
{
ssize_t ret;
size_t total=0;
ssize_t ret;
size_t total=0;
smb_read_error = 0;
smb_read_error = 0;
while (total < N)
{
while (total < N) {
#ifdef WITH_SSL
if(fd == sslFd){
ret = SSL_read(ssl, buffer + total, N - total);
}else{
ret = read(fd,buffer + total,N - total);
}
if(fd == sslFd){
ret = SSL_read(ssl, buffer + total, N - total);
}else{
ret = sys_read(fd,buffer + total,N - total);
}
#else /* WITH_SSL */
ret = read(fd,buffer + total,N - total);
ret = sys_read(fd,buffer + total,N - total);
#endif /* WITH_SSL */
if (ret == 0)
{
DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_EOF;
return 0;
}
if (ret == -1)
{
DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_ERROR;
return -1;
}
total += ret;
}
return (ssize_t)total;
if (ret == 0) {
DEBUG(10,("read_data: read of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_EOF;
return 0;
}
if (ret == -1) {
DEBUG(0,("read_data: read failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_ERROR;
return -1;
}
total += ret;
}
return (ssize_t)total;
}
/****************************************************************************
@ -463,38 +461,36 @@ ssize_t read_data(int fd,char *buffer,size_t N)
static ssize_t read_socket_data(int fd,char *buffer,size_t N)
{
ssize_t ret;
size_t total=0;
ssize_t ret;
size_t total=0;
smb_read_error = 0;
smb_read_error = 0;
while (total < N)
{
while (total < N) {
#ifdef WITH_SSL
if(fd == sslFd){
ret = SSL_read(ssl, buffer + total, N - total);
}else{
ret = read(fd,buffer + total,N - total);
if(fd == sslFd){
ret = SSL_read(ssl, buffer + total, N - total);
}else{
ret = sys_read(fd,buffer + total,N - total);
}
#else /* WITH_SSL */
ret = read(fd,buffer + total,N - total);
ret = sys_read(fd,buffer + total,N - total);
#endif /* WITH_SSL */
if (ret == 0)
{
DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_EOF;
return 0;
}
if (ret == -1)
{
DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_ERROR;
return -1;
}
total += ret;
}
return (ssize_t)total;
if (ret == 0) {
DEBUG(10,("read_socket_data: recv of %d returned 0. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_EOF;
return 0;
}
if (ret == -1) {
DEBUG(0,("read_socket_data: recv failure for %d. Error = %s\n", (int)(N - total), strerror(errno) ));
smb_read_error = READ_ERROR;
return -1;
}
total += ret;
}
return (ssize_t)total;
}
/****************************************************************************
@ -503,30 +499,30 @@ static ssize_t read_socket_data(int fd,char *buffer,size_t N)
ssize_t write_data(int fd,char *buffer,size_t N)
{
size_t total=0;
ssize_t ret;
size_t total=0;
ssize_t ret;
while (total < N)
{
while (total < N) {
#ifdef WITH_SSL
if(fd == sslFd){
ret = SSL_write(ssl,buffer + total,N - total);
}else{
ret = write(fd,buffer + total,N - total);
}
if(fd == sslFd){
ret = SSL_write(ssl,buffer + total,N - total);
}else{
ret = sys_write(fd,buffer + total,N - total);
}
#else /* WITH_SSL */
ret = write(fd,buffer + total,N - total);
ret = sys_write(fd,buffer + total,N - total);
#endif /* WITH_SSL */
if (ret == -1) {
DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
return -1;
}
if (ret == 0) return total;
if (ret == -1) {
DEBUG(0,("write_data: write failure. Error = %s\n", strerror(errno) ));
return -1;
}
if (ret == 0)
return total;
total += ret;
}
return (ssize_t)total;
total += ret;
}
return (ssize_t)total;
}
/****************************************************************************
@ -535,30 +531,30 @@ ssize_t write_data(int fd,char *buffer,size_t N)
ssize_t write_socket_data(int fd,char *buffer,size_t N)
{
size_t total=0;
ssize_t ret;
size_t total=0;
ssize_t ret;
while (total < N)
{
while (total < N) {
#ifdef WITH_SSL
if(fd == sslFd){
ret = SSL_write(ssl,buffer + total,N - total);
}else{
ret = send(fd,buffer + total,N - total, 0);
if(fd == sslFd){
ret = SSL_write(ssl,buffer + total,N - total);
}else{
ret = sys_send(fd,buffer + total,N - total, 0);
}
#else /* WITH_SSL */
ret = send(fd,buffer + total,N - total,0);
ret = sys_send(fd,buffer + total,N - total,0);
#endif /* WITH_SSL */
if (ret == -1) {
DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
return -1;
}
if (ret == 0) return total;
if (ret == -1) {
DEBUG(0,("write_socket_data: write failure. Error = %s\n", strerror(errno) ));
return -1;
}
if (ret == 0)
return total;
total += ret;
}
return (ssize_t)total;
total += ret;
}
return (ssize_t)total;
}
/****************************************************************************
@ -567,17 +563,17 @@ write to a socket
ssize_t write_socket(int fd,char *buf,size_t len)
{
ssize_t ret=0;
ssize_t ret=0;
DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
ret = write_socket_data(fd,buf,len);
DEBUG(6,("write_socket(%d,%d)\n",fd,(int)len));
ret = write_socket_data(fd,buf,len);
DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
if(ret <= 0)
DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
(int)len, fd, strerror(errno) ));
DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,(int)len,(int)ret));
if(ret <= 0)
DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
(int)len, fd, strerror(errno) ));
return(ret);
return(ret);
}
/****************************************************************************
@ -590,30 +586,29 @@ timeout is in milliseconds.
static ssize_t read_smb_length_return_keepalive(int fd,char *inbuf,unsigned int timeout)
{
ssize_t len=0;
int msg_type;
BOOL ok = False;
ssize_t len=0;
int msg_type;
BOOL ok = False;
while (!ok)
{
if (timeout > 0)
ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
else
ok = (read_socket_data(fd,inbuf,4) == 4);
while (!ok) {
if (timeout > 0)
ok = (read_socket_with_timeout(fd,inbuf,4,4,timeout) == 4);
else
ok = (read_socket_data(fd,inbuf,4) == 4);
if (!ok)
return(-1);
if (!ok)
return(-1);
len = smb_len(inbuf);
msg_type = CVAL(inbuf,0);
len = smb_len(inbuf);
msg_type = CVAL(inbuf,0);
if (msg_type == SMBkeepalive)
DEBUG(5,("Got keepalive packet\n"));
}
if (msg_type == SMBkeepalive)
DEBUG(5,("Got keepalive packet\n"));
}
DEBUG(10,("got smb length of %d\n",len));
DEBUG(10,("got smb length of %d\n",len));
return(len);
return(len);
}
/****************************************************************************
@ -625,23 +620,22 @@ timeout is in milliseconds.
ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout)
{
ssize_t len;
ssize_t len;
for(;;)
{
len = read_smb_length_return_keepalive(fd, inbuf, timeout);
for(;;) {
len = read_smb_length_return_keepalive(fd, inbuf, timeout);
if(len < 0)
return len;
if(len < 0)
return len;
/* Ignore session keepalives. */
if(CVAL(inbuf,0) != SMBkeepalive)
break;
}
/* Ignore session keepalives. */
if(CVAL(inbuf,0) != SMBkeepalive)
break;
}
DEBUG(10,("read_smb_length: got smb length of %d\n",len));
DEBUG(10,("read_smb_length: got smb length of %d\n",len));
return len;
return len;
}
/****************************************************************************

View File

@ -169,6 +169,7 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset,
int rw_type, int lck_type, int probe)
{
struct flock fl;
int ret;
if (tdb->flags & TDB_NOLOCK)
return 0;
@ -183,7 +184,12 @@ static int tdb_brlock(TDB_CONTEXT *tdb, tdb_off offset,
fl.l_len = 1;
fl.l_pid = 0;
if (fcntl(tdb->fd,lck_type,&fl) == -1) {
do {
errno = 0;
ret = fcntl(tdb->fd,lck_type,&fl);
} while (ret == -1 && errno == EINTR);
if (ret == -1) {
if (!probe) {
TDB_LOG((tdb, 5,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d lck_type=%d\n",
tdb->fd, offset, rw_type, lck_type));