kdb: Simplify management of tmpbuffer in kdb_read()
[linux-2.6-block.git] / kernel / debug / kdb / kdb_io.c
index 40617f36a6db483a3c23b389922e083d063468de..3131334d7a81ca4b382512e1302ed9dbf9f403a5 100644 (file)
@@ -239,6 +239,7 @@ static char *kdb_read(char *buffer, size_t bufsize)
                                                 * and null byte */
        char *lastchar;
        char *p_tmp;
+       char tmp;
        static char tmpbuffer[CMD_BUFLEN];
        int len = strlen(buffer);
        int len_tmp;
@@ -246,8 +247,7 @@ static char *kdb_read(char *buffer, size_t bufsize)
        int count;
        int i;
        int diag, dtab_count;
-       int key, buf_size, ret;
-
+       int key, ret;
 
        diag = kdbgetintenv("DTABCOUNT", &dtab_count);
        if (diag)
@@ -329,21 +329,16 @@ poll_again:
        case 9: /* Tab */
                if (tab < 2)
                        ++tab;
-               p_tmp = buffer;
-               while (*p_tmp == ' ')
-                       p_tmp++;
-               if (p_tmp > cp)
-                       break;
-               memcpy(tmpbuffer, p_tmp, cp-p_tmp);
-               *(tmpbuffer + (cp-p_tmp)) = '\0';
-               p_tmp = strrchr(tmpbuffer, ' ');
-               if (p_tmp)
-                       ++p_tmp;
-               else
-                       p_tmp = tmpbuffer;
-               len = strlen(p_tmp);
-               buf_size = sizeof(tmpbuffer) - (p_tmp - tmpbuffer);
-               count = kallsyms_symbol_complete(p_tmp, buf_size);
+
+               tmp = *cp;
+               *cp = '\0';
+               p_tmp = strrchr(buffer, ' ');
+               p_tmp = (p_tmp ? p_tmp + 1 : buffer);
+               strscpy(tmpbuffer, p_tmp, sizeof(tmpbuffer));
+               *cp = tmp;
+
+               len = strlen(tmpbuffer);
+               count = kallsyms_symbol_complete(tmpbuffer, sizeof(tmpbuffer));
                if (tab == 2 && count > 0) {
                        kdb_printf("\n%d symbols are found.", count);
                        if (count > dtab_count) {
@@ -355,14 +350,14 @@ poll_again:
                        }
                        kdb_printf("\n");
                        for (i = 0; i < count; i++) {
-                               ret = kallsyms_symbol_next(p_tmp, i, buf_size);
+                               ret = kallsyms_symbol_next(tmpbuffer, i, sizeof(tmpbuffer));
                                if (WARN_ON(!ret))
                                        break;
                                if (ret != -E2BIG)
-                                       kdb_printf("%s ", p_tmp);
+                                       kdb_printf("%s ", tmpbuffer);
                                else
-                                       kdb_printf("%s... ", p_tmp);
-                               *(p_tmp + len) = '\0';
+                                       kdb_printf("%s... ", tmpbuffer);
+                               tmpbuffer[len] = '\0';
                        }
                        if (i >= dtab_count)
                                kdb_printf("...");
@@ -373,14 +368,14 @@ poll_again:
                                kdb_position_cursor(kdb_prompt_str, buffer, cp);
                } else if (tab != 2 && count > 0) {
                        /* How many new characters do we want from tmpbuffer? */
-                       len_tmp = strlen(p_tmp) - len;
+                       len_tmp = strlen(tmpbuffer) - len;
                        if (lastchar + len_tmp >= bufend)
                                len_tmp = bufend - lastchar;
 
                        if (len_tmp) {
                                /* + 1 ensures the '\0' is memmove'd */
                                memmove(cp+len_tmp, cp, (lastchar-cp) + 1);
-                               memcpy(cp, p_tmp+len, len_tmp);
+                               memcpy(cp, tmpbuffer+len, len_tmp);
                                kdb_printf("%s", cp);
                                cp += len_tmp;
                                lastchar += len_tmp;