r21132: - Fixes bug 4366. Documentation for smbc_utimes() was incorrect.
authorDerrell Lipman <derrell@samba.org>
Sat, 3 Feb 2007 17:13:58 +0000 (17:13 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:17:42 +0000 (12:17 -0500)
- Should fix bug 4115 (but needs confirmation from OP).  If the kerberos use
  flag is set in the context, then also pass it to smbc_attr_server for use by
  cli_full_connection()

- Should fix bug 4309 (but needs confirmation from OP).  We no longer send a
  keepalive packet unconditionally.  Instead, we assume (yes, possibly
  incorrectly, but it's the best guess we can make) that if the connection is
  on port 139, it's netbios and otherwise, it isn't.  If netbios is in use, we
  send a keepalive packet.  Otherwise, we check that the connection is alive
  using getpeername().

source/include/libsmbclient.h
source/libsmb/libsmbclient.c

index 45f2a41b088e9ca951f5dbcef457822f35cb6798..5d674264d8c97d8f89a7255f9f5351bafa4fd54b 100644 (file)
@@ -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
index 4778274ca9d55b729ed3fb80e6a0f5e2dc471f9e..48f6c3a9c244e3f5bdabdd8bc4abbf8ce29ca282 100644 (file)
@@ -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",