/* * Complete a remote file */ static unsigned char complete_remote(char *word, int list) { static StringList *dirlist; static char lastdir[MAXPATHLEN]; StringList *words; char dir[MAXPATHLEN]; char *file, *cp; int i; unsigned char rv; char *dummyargv[] = { "complete", dir, NULL }; if ((file = strrchr(word, '/')) == NULL) { dir[0] = '.'; dir[1] = '\0'; file = word; } else { cp = file; while (*cp == '/' && cp > word) cp--; (void)strlcpy(dir, word, (size_t)(cp - word + 2)); file++; } if (dirchange || strcmp(dir, lastdir) != 0) { /* dir not cached */ char *emesg; sl_free(dirlist, 1); dirlist = sl_init(); mflag = 1; emesg = NULL; #ifndef SMALL if (debug) (void)putc('\n', ttyout); #endif /* !SMALL */ while ((cp = remglob(dummyargv, 0, &emesg)) != NULL) { char *tcp; if (!mflag) continue; if (*cp == '\0') { mflag = 0; continue; } tcp = strrchr(cp, '/'); if (tcp) tcp++; else tcp = cp; tcp = strdup(tcp); if (tcp == NULL) errx(1, "Can't allocate memory for remote dir"); sl_add(dirlist, tcp); } if (emesg != NULL) { fprintf(ttyout, "\n%s\n", emesg); return (CC_REDISPLAY); } (void)strlcpy(lastdir, dir, sizeof lastdir); dirchange = 0; } words = sl_init(); for (i = 0; i < dirlist->sl_cur; i++) { cp = dirlist->sl_str[i]; if (strlen(file) > strlen(cp)) continue; if (strncmp(file, cp, strlen(file)) == 0) sl_add(words, cp); } rv = complete_ambiguous(file, list, words); sl_free(words, 0); return (rv); }
/* * Complete a remote file */ static unsigned char complete_remote(char *word, int list) { static StringList *dirlist; static char lastdir[MAXPATHLEN]; StringList *words; char dir[MAXPATHLEN]; char *file, *cp; size_t i; unsigned char rv; char cmdbuf[MAX_C_NAME]; char *dummyargv[3] = { NULL, NULL, NULL }; (void)strlcpy(cmdbuf, "complete", sizeof(cmdbuf)); dummyargv[0] = cmdbuf; dummyargv[1] = dir; if ((file = strrchr(word, '/')) == NULL) { dir[0] = '\0'; file = word; } else { cp = file; while (*cp == '/' && cp > word) cp--; (void)strlcpy(dir, word, cp - word + 2); file++; } if (dirchange || dirlist == NULL || strcmp(dir, lastdir) != 0) { /* dir not cached */ const char *emesg; if (dirlist != NULL) sl_free(dirlist, 1); dirlist = ftp_sl_init(); mflag = 1; emesg = NULL; while ((cp = remglob(dummyargv, 0, &emesg)) != NULL) { char *tcp; if (!mflag) continue; if (*cp == '\0') { mflag = 0; continue; } tcp = strrchr(cp, '/'); if (tcp) tcp++; else tcp = cp; tcp = ftp_strdup(tcp); ftp_sl_add(dirlist, tcp); } if (emesg != NULL) { fprintf(ttyout, "\n%s\n", emesg); return (CC_REDISPLAY); } (void)strlcpy(lastdir, dir, sizeof(lastdir)); dirchange = 0; } words = ftp_sl_init(); for (i = 0; i < dirlist->sl_cur; i++) { cp = dirlist->sl_str[i]; if (strlen(file) > strlen(cp)) continue; if (strncmp(file, cp, strlen(file)) == 0) ftp_sl_add(words, cp); } rv = complete_ambiguous(file, list, words); sl_free(words, 0); return (rv); }