summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-10-01 06:50:38 +0000
committerJeremy Allison <jra@samba.org>2002-10-01 06:50:38 +0000
commit8147df0b6b4674670e70b45c603e8323e5c61c33 (patch)
tree1829641fa33ccb9eda1a3fd96f1bdf77b6658ac4
parent88e481ec13505f7e870a2172db3d4edf5ce47caf (diff)
downloadsamba-8147df0b6b4674670e70b45c603e8323e5c61c33.tar.gz
samba-8147df0b6b4674670e70b45c603e8323e5c61c33.tar.bz2
samba-8147df0b6b4674670e70b45c603e8323e5c61c33.zip
Cope with rw errors and timeout to peer.
Jeremy. (This used to be commit d8d351eb01ea7c84828dbc96224d7b13d643b558)
-rw-r--r--source3/include/client.h2
-rw-r--r--source3/include/smb.h2
-rw-r--r--source3/libsmb/clientgen.c5
-rw-r--r--source3/libsmb/clierror.c30
4 files changed, 31 insertions, 8 deletions
diff --git a/source3/include/client.h b/source3/include/client.h
index 7a8889edc5..17fd150065 100644
--- a/source3/include/client.h
+++ b/source3/include/client.h
@@ -70,7 +70,7 @@ typedef struct smb_sign_info {
struct cli_state {
int port;
int fd;
- int smb_read_error; /* Copy of last read error. */
+ int smb_rw_error; /* Copy of last read or write error. */
uint16 cnum;
uint16 pid;
uint16 mid;
diff --git a/source3/include/smb.h b/source3/include/smb.h
index c39ebed950..f58e3adf54 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -161,6 +161,8 @@ typedef uint16 smb_ucs2_t;
typedef smb_ucs2_t wpstring[PSTRING_LEN];
typedef smb_ucs2_t wfstring[FSTRING_LEN];
+/* This error code can go into the client smb_rw_error. */
+#define WRITE_ERROR 4
#ifdef WORDS_BIGENDIAN
#define UCS2_SHIFT 8
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 4a102097ce..2236d8508d 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -100,7 +100,7 @@ BOOL cli_receive_smb(struct cli_state *cli)
/* If the server is not responding, note that now */
if (!ret) {
- cli->smb_read_error = smb_read_error;
+ cli->smb_rw_error = smb_read_error;
close(cli->fd);
cli->fd = -1;
}
@@ -131,6 +131,7 @@ BOOL cli_send_smb(struct cli_state *cli)
if (ret <= 0) {
close(cli->fd);
cli->fd = -1;
+ cli->smb_rw_error = WRITE_ERROR;
DEBUG(0,("Error writing %d bytes to client. %d (%s)\n",
(int)len,(int)ret, strerror(errno) ));
return False;
@@ -295,7 +296,7 @@ void cli_close_connection(struct cli_state *cli)
if (cli->fd != -1)
close(cli->fd);
cli->fd = -1;
- cli->smb_read_error = 0;
+ cli->smb_rw_error = 0;
}
/****************************************************************************
diff --git a/source3/libsmb/clierror.c b/source3/libsmb/clierror.c
index fb88b66786..f5281eb047 100644
--- a/source3/libsmb/clierror.c
+++ b/source3/libsmb/clierror.c
@@ -85,11 +85,31 @@ char *cli_errstr(struct cli_state *cli)
return cli_error_message;
}
- /* Was it server timeout ? */
- if (cli->fd == -1 && cli->timeout > 0 && cli->smb_read_error == READ_TIMEOUT) {
- slprintf(cli_error_message, sizeof(cli_error_message) - 1,
- "Call timed out: server did not respond after %d milliseconds",
- cli->timeout);
+ /* Was it server socket error ? */
+ if (cli->fd == -1 && cli->smb_rw_error) {
+ switch(cli->smb_rw_error) {
+ case READ_TIMEOUT:
+ slprintf(cli_error_message, sizeof(cli_error_message) - 1,
+ "Call timed out: server did not respond after %d milliseconds",
+ cli->timeout);
+ break;
+ case READ_EOF:
+ slprintf(cli_error_message, sizeof(cli_error_message) - 1,
+ "Call returned zero bytes (EOF)\n" );
+ break;
+ case READ_ERROR:
+ slprintf(cli_error_message, sizeof(cli_error_message) - 1,
+ "Read error: %s\n", strerror(errno) );
+ break;
+ case WRITE_ERROR:
+ slprintf(cli_error_message, sizeof(cli_error_message) - 1,
+ "Write error: %s\n", strerror(errno) );
+ break;
+ default:
+ slprintf(cli_error_message, sizeof(cli_error_message) - 1,
+ "Unknown error code %d\n", cli->smb_rw_error );
+ break;
+ }
return cli_error_message;
}