summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/libsmbclient.h20
-rw-r--r--source3/libsmb/libsmbclient.c34
2 files changed, 42 insertions, 12 deletions
diff --git a/source3/include/libsmbclient.h b/source3/include/libsmbclient.h
index 45f2a41b08..5d674264d8 100644
--- a/source3/include/libsmbclient.h
+++ b/source3/include/libsmbclient.h
@@ -1242,14 +1242,16 @@ int smbc_chown(const char *url, uid_t owner, gid_t group);
*/
int smbc_chmod(const char *url, mode_t mode);
-/**@ingroup attribute
+/**
+ * @ingroup attribute
* Change the last modification time on a file
*
* @param url The smb url of the file or directory to change
* the modification time of
- *
- * @param tbuf A timeval structure which contains the desired
- * modification time. NOTE: Only the tv_sec field is
+ *
+ * @param tbuf An array of two timeval structures which contains,
+ * respectively, the desired access and modification times.
+ * NOTE: Only the tv_sec field off each timeval structure is
* used. The tv_usec (microseconds) portion is ignored.
*
* @return 0 on success, < 0 on error with errno set:
@@ -1260,15 +1262,15 @@ int smbc_chmod(const char *url, mode_t mode);
int smbc_utimes(const char *url, struct timeval *tbuf);
#ifdef HAVE_UTIME_H
-/**@ingroup attribute
+/**
+ * @ingroup attribute
* Change the last modification time on a file
*
* @param url The smb url of the file or directory to change
* the modification time of
- *
- * @param utbuf A utimebuf structure which contains the desired
- * modification time. NOTE: Although the structure contains
- * an access time as well, the access time value is ignored.
+ *
+ * @param utbuf A pointer to a utimebuf structure which contains the
+ * desired access and modification times.
*
* @return 0 on success, < 0 on error with errno set:
* - EINVAL The client library is not properly initialized
diff --git a/source3/libsmb/libsmbclient.c b/source3/libsmb/libsmbclient.c
index 4778274ca9..48f6c3a9c2 100644
--- a/source3/libsmb/libsmbclient.c
+++ b/source3/libsmb/libsmbclient.c
@@ -499,8 +499,30 @@ static int
smbc_check_server(SMBCCTX * context,
SMBCSRV * server)
{
- if ( send_keepalive(server->cli->fd) == False )
- return 1;
+ int size;
+ struct sockaddr addr;
+
+ /*
+ * Although the use of port 139 is not a guarantee that we're using
+ * netbios, we assume so. We don't want to send a keepalive packet if
+ * not netbios because it's not valid, and Vista, at least,
+ * disconnects the client on such a request.
+ */
+ if (server->cli->port == 139) {
+ /* Assuming netbios. Send a keepalive packet */
+ if ( send_keepalive(server->cli->fd) == False ) {
+ return 1;
+ }
+ } else {
+ /*
+ * Assuming not netbios. Try a different method to detect if
+ * the connection is still alive.
+ */
+ size = sizeof(addr);
+ if (getpeername(server->cli->fd, &addr, &size) == -1) {
+ return 1;
+ }
+ }
/* connection is ok */
return 0;
@@ -917,6 +939,7 @@ smbc_attr_server(SMBCCTX *context,
fstring password,
POLICY_HND *pol)
{
+ int flags;
struct in_addr ip;
struct cli_state *ipc_cli;
struct rpc_pipe_client *pipe_hnd;
@@ -951,12 +974,17 @@ smbc_attr_server(SMBCCTX *context,
}
}
+ flags = 0;
+ if (context->flags & SMB_CTX_FLAG_USE_KERBEROS) {
+ flags |= CLI_FULL_CONNECTION_USE_KERBEROS;
+ }
+
zero_ip(&ip);
nt_status = cli_full_connection(&ipc_cli,
global_myname(), server,
&ip, 0, "IPC$", "?????",
username, workgroup,
- password, 0,
+ password, flags,
Undefined, NULL);
if (! NT_STATUS_IS_OK(nt_status)) {
DEBUG(1,("cli_full_connection failed! (%s)\n",