/* Print the command shell's prompt. */ void MakePrompt(char *dst, size_t dsize) { char acwd[64]; # ifdef HAVE_SNPRINTF if (gConn.loggedIn != 0) { AbbrevStr(acwd, gRemoteCWD, 25, 0); snprintf(dst, dsize, "%sncftp%s %s %s>%s ", tcap_boldface, tcap_normal, acwd, tcap_boldface, tcap_normal); } else { snprintf(dst, dsize, "%sncftp%s> ", tcap_boldface, tcap_normal); } # else /* HAVE_SNPRINTF */ (void) Strncpy(dst, tcap_boldface, dsize); (void) Strncat(dst, "ncftp", dsize); (void) Strncat(dst, tcap_normal, dsize); if (gConn.loggedIn != 0) { AbbrevStr(acwd, gRemoteCWD, 25, 0); (void) Strncat(dst, " ", dsize); (void) Strncat(dst, acwd, dsize); (void) Strncat(dst, " ", dsize); } (void) Strncat(dst, tcap_boldface, dsize); (void) Strncat(dst, ">", dsize); (void) Strncat(dst, tcap_normal, dsize); (void) Strncat(dst, " ", dsize); # endif /* HAVE_SNPRINTF */ } /* MakePrompt */
/***************************************************************************** * Private Functions *****************************************************************************/ static void CheckFreePrivInfo(_DtCvSegment *seg) { /* * free the match information */ if (NULL != MatchInfo(seg)) { SdlMatchData *m = (SdlMatchData *)(MatchInfo(seg)); if (NULL != m->ssi) free(m->ssi); free(m); } /* * free any abbreviation */ if (NULL != AbbrevStr(seg)) free(AbbrevStr(seg)); }
/* This is the meat of the site options window. We can selectively update * portions of the window by using a bitmask with bits set for items * we want to update. */ void EditHostWinDraw(int flags, int hilite) { int maxy, maxx; int i, f; char str[256]; char spec[32]; const char *cp; /* Draw the keys the user can type in reverse text. */ WAttr(gEditHostWin, kReverse, 1); f = 5; for (i = kFirstEditWindowItem; i <= kLastEditWindowItem; i++) { if (TESTBIT(flags, i)) mvwaddch(gEditHostWin, f + i, 2, 'A' + i); } /* The "quit" item is a special item that is offset a line, and * always has the "X" key assigned to it. */ i = kQuitEditWindowItem; if (TESTBIT(flags, i)) mvwaddch(gEditHostWin, 1 + f + i, 2, 'X'); WAttr(gEditHostWin, kReverse, 0); /* We can use this to hilite a whole line, to indicate to the * user that a certain item is being edited. */ if (hilite) WAttr(gEditHostWin, kReverse, 1); getmaxyx(gEditHostWin, maxy, maxx); sprintf(spec, " %%-26s%%-%ds", maxx - 32); /* Now draw the items on a case-by-case basis. */ if (TESTBIT(flags, kNicknameEditWindowItem)) { mvwprintw(gEditHostWin, kNicknameEditWindowItem + f, 3, spec, "Bookmark name:", gEditRsi.bookmarkName ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kHostnameEditWindowItem)) { mvwprintw(gEditHostWin, kHostnameEditWindowItem + f, 3, spec, "Hostname:", gEditRsi.name ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kUserEditWindowItem)) { mvwprintw(gEditHostWin, kUserEditWindowItem + f, 3, spec, "User:"******"anonymous" : gEditRsi.user ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kPassEditWindowItem)) { if (gEditRsi.pass[0] == '\0' && gEditRsi.user[0] == '\0') STRNCPY(str, gLib.defaultAnonPassword); mvwprintw(gEditHostWin, kPassEditWindowItem + f, 3, spec, "Password:"******"********" : str ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kAcctEditWindowItem)) { mvwprintw(gEditHostWin, kAcctEditWindowItem + f, 3, spec, "Account:", gEditRsi.acct[0] == '\0' ? "none" : gEditRsi.acct ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kDirEditWindowItem)) { if (gEditRsi.dir[0] == '\0') STRNCPY(str, "/"); else AbbrevStr(str, gEditRsi.dir, (size_t) maxx - 32, 0); mvwprintw(gEditHostWin, kDirEditWindowItem + f, 3, spec, "Remote Directory:", str ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kLDirEditWindowItem)) { if (gEditRsi.ldir[0] == '\0') STRNCPY(str, "(current)"); else AbbrevStr(str, gEditRsi.ldir, (size_t) maxx - 32, 0); mvwprintw(gEditHostWin, kLDirEditWindowItem + f, 3, spec, "Local Directory:", str ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kXferTypeEditWindowItem)) { if ((gEditRsi.xferType == 'I') || (gEditRsi.xferType == 'B')) cp = "Binary"; else if (gEditRsi.xferType == 'A') cp = "ASCII Text"; else cp = "Tenex"; mvwprintw(gEditHostWin, kXferTypeEditWindowItem + f, 3, spec, "Transfer type:", cp ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kPortEditWindowItem)) { sprintf(str, "%u", (gEditRsi.port == 0) ? 21 : (unsigned int) gEditRsi.port); mvwprintw(gEditHostWin, kPortEditWindowItem + f, 3, spec, "Port:", str ); wclrtoeol(gEditHostWin); } #if 0 if (TESTBIT(flags, kSizeEditWindowItem)) { mvwprintw(gEditHostWin, kSizeEditWindowItem + f, 3, spec, "Has SIZE command:", gEditRsi.hasSIZE ? "Yes" : "No" ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kMdtmEditWindowItem)) { mvwprintw(gEditHostWin, kMdtmEditWindowItem + f, 3, spec, "Has MDTM command:", gEditRsi.hasMDTM ? "Yes" : "No" ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kPasvEditWindowItem)) { mvwprintw(gEditHostWin, kPasvEditWindowItem + f, 3, spec, "Can use passive FTP:", gEditRsi.hasPASV ? "Yes" : "No" ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kOSEditWindowItem)) { mvwprintw(gEditHostWin, kOSEditWindowItem + f, 3, spec, "Operating System:", (gEditRsi.isUnix == 1) ? "UNIX" : "Non-UNIX" ); wclrtoeol(gEditHostWin); } #endif if (TESTBIT(flags, kCommentEditWindowItem)) { if (gEditRsi.comment[0] == '\0') STRNCPY(str, "(none)"); else AbbrevStr(str, gEditRsi.comment, (size_t) maxx - 32, 0); mvwprintw(gEditHostWin, kCommentEditWindowItem + f, 3, spec, "Comment:", str ); wclrtoeol(gEditHostWin); } if (TESTBIT(flags, kQuitEditWindowItem)) { mvwprintw(gEditHostWin, kQuitEditWindowItem + f + 1, 3, spec, "(Done editing)", "" ); wclrtoeol(gEditHostWin); } if (hilite) WAttr(gEditHostWin, kReverse, 0); wmove(gEditHostWin, maxy - 1, 0); wrefresh(gEditHostWin); } /* EditHostWinDraw */
int PrStatBar(XferSpecPtr xp, int mode) { int result = kPrWantStatsMsg; double rate, done; int secLeft, minLeft; char *rStr; static char *uStr; static double uTotal, uMult; char localName[32]; string line; int i; switch (mode) { case kPrInitMsg: uTotal = FileSize((double) xp->expectedSize, &uStr, &uMult); /* Leave room for a ':' and '\0'. */ AbbrevStr(localName, xp->localFileName, 30, 0); STRNCAT(localName, ":"); EPrintF("%-32s", localName); break; case kPrUpdateMsg: /* Guess how much time is remaining in the transfer, based on * the current transfer statistics. */ secLeft = (int) ((xp->bytesLeft / xp->bytesPerSec) + 0.5); minLeft = secLeft / 60; secLeft = secLeft - (minLeft * 60); if (minLeft > 999) { minLeft = 999; secLeft = 59; } rate = FileSize(xp->bytesPerSec, &rStr, NULL); done = (double) xp->bytesTransferred / uMult; AbbrevStr(localName, xp->localFileName, sizeof(localName) - 2, 0); STRNCAT(localName, ":"); sprintf(line, "%-32s %5.1f/%.1f %s %5.1f %s/s ETA %3d:%02d", localName, done, uTotal, uStr, rate, rStr, minLeft, secLeft ); /* Pad the rest of the line with spaces, to erase any * stuff that might have been left over from the last * update. */ for (i=strlen(line); i < gScreenWidth - 2; i++) line[i] = ' '; line[i] = '\0'; /* Print the updated information. */ EPrintF("\r%s", line); break; case kPrEndMsg: result = kPrWantStatsMsg; EPrintF("\r"); break; } return result; } /* PrStatBar */
/* This draws the scrolling list of bookmarks, and hilites the currently * selected host. */ void DrawHostList(void) { int lastLine, i; BookmarkPtr rsip; char str[256]; char url[256]; int maxy, maxx; int lmaxy, lmaxx; int begy, begx; char spec[32]; getmaxyx(gHostListWin, lmaxy, lmaxx); getbegyx(gHostListWin, begy, begx); getmaxyx(gHostWin, maxy, maxx); /* We have a status line saying how many bookmarks there are in * the list. That way the user knows something is supposed to * be there when the host list is totally empty, and also that * there are more bookmarks to look at when the entire host list * doesn't fit in the scroll window. */ WAttr(gHostWin, kUnderline, 1); mvwprintw( gHostWin, begy - 1, begx, strcpy(spec, "%s"), /* avoid warnings on BSD */ "Number of bookmarks" ); WAttr(gHostWin, kUnderline, 0); wprintw( gHostWin, strcpy(spec, ": %3d"), gNumBookmarks ); if (gHostListWinWide == 0) { sprintf(spec, "%%-16.16s %%-%ds", lmaxx - 17); lastLine = lmaxy + gHostListWinStart; for (i=gHostListWinStart; (i<lastLine) && (i<gNumBookmarks); i++) { rsip = &gBookmarkTable[i]; if (rsip == gCurHostListItem) WAttr(gHostListWin, kReverse, 1); sprintf(str, spec, rsip->bookmarkName, rsip->name); str[lmaxx] = '\0'; DrawStrAt(gHostListWin, i - gHostListWinStart, 0, str); swclrtoeol(gHostListWin); if (rsip == gCurHostListItem) { WAttr(gHostListWin, kReverse, 0); } } } else { lastLine = lmaxy + gHostListWinStart; for (i=gHostListWinStart; (i<lastLine) && (i<gNumBookmarks); i++) { rsip = &gBookmarkTable[i]; if (rsip == gCurHostListItem) WAttr(gHostListWin, kReverse, 1); BookmarkToURL(rsip, url, sizeof(url)); sprintf(str, "%-16.16s ", rsip->bookmarkName); STRNCAT(str, url); memset(url, 0, sizeof(url)); AbbrevStr(url, str, (size_t) lmaxx, 1); DrawStrAt(gHostListWin, i - gHostListWinStart, 0, url); swclrtoeol(gHostListWin); if (rsip == gCurHostListItem) { WAttr(gHostListWin, kReverse, 0); } } } /* Add 'vi' style empty-lines. */ for ( ; i<lastLine; ++i) { DrawStrAt(gHostListWin, i - gHostListWinStart, 0, "~"); swclrtoeol(gHostListWin); } wmove(gHostWin, maxy - 3, 2); sprintf(spec, "%%-%ds", maxx - 4); if (gCurHostListItem == NULL) { str[0] = '\0'; } else if (gCurHostListItem->comment[0] == '\0') { memset(str, 0, sizeof(str)); if (gHostListWinWide == 0) { BookmarkToURL(gCurHostListItem, url, sizeof(url)); AbbrevStr(str, url, (size_t) maxx - 2, 1); } } else { STRNCPY(str, "``"); STRNCAT(str, gCurHostListItem->comment); AbbrevStr(str + 2, gCurHostListItem->comment, (size_t) maxx - 8, 1); STRNCAT(str, "''"); } wprintw(gHostWin, spec, str); wmove(gHostWin, maxy - 1, 0); UpdateHostWindows(0); } /* DrawHostList */