diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/libsmbclient.h | 20 | ||||
-rw-r--r-- | source3/libsmb/libsmbclient.c | 34 |
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", |