[BACK]Return to complete.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ftp

Diff for /src/usr.bin/ftp/complete.c between version 1.23 and 1.24

version 1.23, 2009/05/05 19:35:30 version 1.24, 2010/04/25 09:11:54
Line 50 
Line 50 
 static unsigned char complete_command(char *, int);  static unsigned char complete_command(char *, int);
 static unsigned char complete_local(char *, int);  static unsigned char complete_local(char *, int);
 static unsigned char complete_remote(char *, int);  static unsigned char complete_remote(char *, int);
   static void          ftpvis(char *, size_t, const char *, size_t);
   
 static int  static int
 comparstr(const void *a, const void *b)  comparstr(const void *a, const void *b)
Line 70 
Line 71 
 static unsigned char  static unsigned char
 complete_ambiguous(char *word, int list, StringList *words)  complete_ambiguous(char *word, int list, StringList *words)
 {  {
         char insertstr[MAXPATHLEN];          char insertstr[MAXPATHLEN * 2];
         char *lastmatch;          char *lastmatch;
         int i, j;          int i, j;
         size_t matchlen, wordlen;          size_t matchlen, wordlen;
Line 80 
Line 81 
                 return (CC_ERROR);      /* no choices available */                  return (CC_ERROR);      /* no choices available */
   
         if (words->sl_cur == 1) {       /* only once choice available */          if (words->sl_cur == 1) {       /* only once choice available */
                 (void)strlcpy(insertstr, words->sl_str[0], sizeof insertstr);                  char *p = words->sl_str[0] + wordlen;
                 if (el_insertstr(el, insertstr + wordlen) == -1)                  ftpvis(insertstr, sizeof(insertstr), p, strlen(p));
                   if (el_insertstr(el, insertstr) == -1)
                         return (CC_ERROR);                          return (CC_ERROR);
                 else                  else
                         return (CC_REFRESH);                          return (CC_REFRESH);
Line 99 
Line 101 
                                 matchlen = j;                                  matchlen = j;
                 }                  }
                 if (matchlen > wordlen) {                  if (matchlen > wordlen) {
                         (void)strlcpy(insertstr, lastmatch, matchlen+1);                          ftpvis(insertstr, sizeof(insertstr),
                         if (el_insertstr(el, insertstr + wordlen) == -1)                              lastmatch + wordlen, matchlen);
                           if (el_insertstr(el, insertstr) == -1)
                                 return (CC_ERROR);                                  return (CC_ERROR);
                         else                          else
                                         /*                                          /*
Line 345 
Line 348 
         }          }
   
         return (CC_ERROR);          return (CC_ERROR);
   }
   
   /*
    * Copy characters from src into dst, \ quoting characters that require it.
    */
   static void
   ftpvis(char *dst, size_t dstlen, const char *src, size_t srclen)
   {
           size_t  di, si;
   
           /* paranoia paranoia everybody's trying to get me */
           if (dstlen == 0)
                   return;
           if (srclen == 0) {
                   dst[0] = '\0';
                   return;
           }
   
           di = si = 0;
           while (src[si] != '\0' && di < dstlen && si < srclen) {
                   switch (src[si]) {
                   case '\\':
                   case ' ':
                   case '\t':
                   case '\r':
                   case '\n':
                   case '"':
                           /* Need room for two characters and NUL, avoiding
                            * incomplete escape sequences at end of dst. */
                           if (di >= dstlen - 3)
                                   break;
                           dst[di++] = '\\';
                           /* FALLTHROUGH */
                   default:
                           dst[di] = src[si++];
                           if (di < dstlen)
                                   di++;
                   }
           }
           dst[di] = '\0';
 }  }
   
 #endif /* !SMALL */  #endif /* !SMALL */

Legend:
Removed from v.1.23  
changed lines
  Added in v.1.24