svn commit: samba r18402 - in branches/SAMBA_3_0/source/client: .

vlendec at samba.org vlendec at samba.org
Mon Sep 11 21:33:55 GMT 2006


Author: vlendec
Date: 2006-09-11 21:33:53 +0000 (Mon, 11 Sep 2006)
New Revision: 18402

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=18402

Log:
Comment and (hopefully) fix remote command completion for smbclient.

Fix Bug ID 4084.

Volker

Modified:
   branches/SAMBA_3_0/source/client/client.c


Changeset:
Modified: branches/SAMBA_3_0/source/client/client.c
===================================================================
--- branches/SAMBA_3_0/source/client/client.c	2006-09-11 21:32:08 UTC (rev 18401)
+++ branches/SAMBA_3_0/source/client/client.c	2006-09-11 21:33:53 UTC (rev 18402)
@@ -3173,7 +3173,14 @@
 	if (!info.matches) {
 		return NULL;
 	}
+
+	/*
+	 * We're leaving matches[0] free to fill it later with the text to
+	 * display: Either the one single match or the longest common subset
+	 * of the matches.
+	 */
 	info.matches[0] = NULL;
+	info.count = 1;
 
 	for (i = len-1; i >= 0; i--) {
 		if ((text[i] == '/') || (text[i] == CLI_DIRSEP_CHAR)) {
@@ -3195,15 +3202,36 @@
 	if (cli_list(cli, dirmask, aDIR | aSYSTEM | aHIDDEN, completion_remote_filter, &info) < 0)
 		goto cleanup;
 
-	if (info.count == 2)
-		info.matches[0] = SMB_STRDUP(info.matches[1]);
-	else {
-		info.matches[0] = (char *)SMB_MALLOC(info.samelen+1);
-		if (!info.matches[0])
-			goto cleanup;
-		strncpy(info.matches[0], info.matches[1], info.samelen);
-		info.matches[0][info.samelen] = 0;
+	if (info.count == 1) {
+
+		/*
+		 * No matches at all, NULL indicates there is nothing
+		 */
+
+		SAFE_FREE(info.matches[0]);
+		SAFE_FREE(info.matches);
+		return NULL;
 	}
+
+	if (info.count == 2) {
+
+		/*
+		 * Exactly one match in matches[1], indicate this is the one
+		 * in matches[0].
+		 */
+
+		info.matches[0] = info.matches[1];
+		info.matches[1] = NULL;
+		info.count -= 1;
+		return info.matches;
+	}
+
+	/*
+	 * We got more than one possible match, set the result to the maximum
+	 * common subset
+	 */
+
+	info.matches[0] = SMB_STRNDUP(info.matches[1], info.samelen);
 	info.matches[info.count] = NULL;
 	return info.matches;
 
@@ -3230,10 +3258,13 @@
 		sp = strchr(buf, ' ');
 		if (sp == NULL)
 			return NULL;
-		
-		for (i = 0; commands[i].name; i++)
-			if ((strncmp(commands[i].name, text, sp - buf) == 0) && (commands[i].name[sp - buf] == 0))
+
+		for (i = 0; commands[i].name; i++) {
+			if ((strncmp(commands[i].name, buf, sp - buf) == 0) &&
+			    (commands[i].name[sp - buf] == 0)) {
 				break;
+			}
+		}
 		if (commands[i].name == NULL)
 			return NULL;
 



More information about the samba-cvs mailing list