This is x_menu.c in view mode; [Download] [Up]
/* * Open a window to display the choices of file transfer protocols and * prompt for the file name(s). A non-zero return code means turn the * input routine back on. */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <curses.h> #include "config.h" #include "extrnl.h" #include "misc.h" #include "xmodem.h" int xfer_menu(up) int up; { extern int fd; extern char *null_ptr; WINDOW *xm_win, *newwin(); char buf[2048], *list, *strcat(), *strcpy(); static char *get_names(), *get_extrnl(); int type, is_batch, i, ans, num_extrnl, n, ret_code; void xfer_win(), xfer_ascii(), do_extrnl(), error_win(); num_extrnl = (up) ? extrnl->up_entries : extrnl->dn_entries; xm_win = newwin(14+num_extrnl, 20, 2, 45); mvwaddstr(xm_win, 2, 3, "1) xmodem"); mvwaddstr(xm_win, 3, 3, "2) xmodem-1k"); mvwaddstr(xm_win, 4, 3, "3) modem7"); mvwaddstr(xm_win, 5, 3, "4) ymodem"); mvwaddstr(xm_win, 6, 3, "5) ymodem-g"); mvwaddstr(xm_win, 7, 3, "6) ASCII"); for (i=0; i<num_extrnl; i++) mvwprintw(xm_win, i+8, 3, "%d) %-12.12s", i+7, extrnl->name[up][i]); mvwaddstr(xm_win, i+8, 3, "E) (external)"); mvwaddstr(xm_win, i+10, 3, "<ESC> to Abort"); mvwaddstr(xm_win, i+11, 3, "Protocol:"); box(xm_win, VERT, HORZ); if (up) mvwattrstr(xm_win, 0, 6, A_BOLD, " Upload "); else mvwattrstr(xm_win, 0, 5, A_BOLD, " Download "); wmove(xm_win, i+11, 13); wrefresh(xm_win); /* get the protocol */ type = -1; while ((ans = wgetch(xm_win)) != ESC) { switch (ans) { case '1': type = XMODEM; break; case '2': type = XMODEM_1k; break; case '3': type = MODEM7; break; case '4': type = YMODEM; break; case '5': type = YMODEM_G; break; case '6': type = XASCII; break; case '7': if (num_extrnl >= 1) type = EXT_1; else beep(); break; case '8': if (num_extrnl >= 2) type = EXT_2; else beep(); break; case '9': if (num_extrnl >= 3) type = EXT_3; else beep(); break; case 'e': case 'E': type = EXT_MANUAL; break; default: beep(); } if (type != -1) break; } werase(xm_win); wrefresh(xm_win); delwin(xm_win); /* chicken'd out */ if (type == -1) return(0); if (fd == -1) { error_win(0, "Not currently connected to any host", ""); return(0); } /* which protocol? */ ret_code = 0; is_batch = 0; switch(type) { case MODEM7: case YMODEM: case YMODEM_G: /* built-in protocols */ is_batch++; /* fall thru */ case XMODEM: case XMODEM_1k: /* non-batch built-ins */ list = null_ptr; /* * When receiving in a batch mode, don't prompt * for file names. */ if (up || !is_batch) { if (!(list = get_names(up, type, is_batch))) break; } xfer_win(list, up, type); ret_code++; break; case XASCII: /* ascii xfer, yuck! */ if (list = get_names(up, type, FALSE)) { xfer_ascii(list, up); if (!up) ret_code++; } break; case EXT_1: case EXT_2: case EXT_3: /* one of the externals */ n = type -NUM_INTERNAL; strcpy(buf, extrnl->command[up][n]); /* see if we need to prompt for files */ if (extrnl->prompt[up][n] == 'Y') { if (list = get_names(up, type, TRUE)) { strcat(buf, " "); strcat(buf, list); } else break; } do_extrnl(buf); ret_code++; break; case EXT_MANUAL: /* the manual external protocol */ if (list = get_extrnl(up)) { do_extrnl(list); ret_code++; } break; } return(ret_code); } char *protocol[NUM_INTERNAL] = {"xmodem", "xmodem-1k", "modem7", "ymodem", "ymodem-g", "ASCII"}; /* * Prompt for a list of files for the transfer programs. Since expand() * is used, it returns a pointer to a static area. Returns a NULL if * you chicken'd out. */ static char * get_names(up, type, is_batch) int up, type, is_batch; { int got_it; WINDOW *gn_win, *newwin(); char *ans, *file, *list, buf[40], *expand(), *get_str(), *strtok(); void st_line(); struct stat stbuf; touchwin(stdscr); refresh(); st_line(""); gn_win = newwin(7, 70, 5, 5); mvwaddstr(gn_win, 3, 4, "Enter filename: "); box(gn_win, VERT, HORZ); if (up) { if (type < NUM_INTERNAL) sprintf(buf, " Send %s ", protocol[type]); else sprintf(buf, " Send %s ", extrnl->name[up][type-NUM_INTERNAL]); } else { if (type < NUM_INTERNAL) sprintf(buf, " Receive %s ", protocol[type]); else sprintf(buf, " Receive %s ", extrnl->name[up][type-NUM_INTERNAL]); } mvwattrstr(gn_win, 0, 3, A_BOLD, buf); while (1) { wmove(gn_win, 3, 20); wrefresh(gn_win); /* get the answers */ if (is_batch) ans = get_str(gn_win, 60, "", "\n"); else ans = get_str(gn_win, 60, "", " \t\n"); if (ans == NULL || *ans == '\0') { list = NULL; break; } list = expand(ans); /* batches are checked on-the-fly */ if (is_batch) break; /* * Here we have the opportunity to determine the read and * write permissions before things get started. Much nicer * than finding out later when there's no way to fix it. * Only checks the first file. */ file = strtok(list, " \t"); /* sanity checking */ if (!stat(file, &stbuf)) { if ((stbuf.st_mode & S_IFREG) != S_IFREG) { beep(); clear_line(gn_win, 4, 15, TRUE); mvwattrstr(gn_win, 4, 15, A_BOLD, "Not a regular file"); wrefresh(gn_win); wait_key(gn_win, 3); clear_line(gn_win, 4, 15, TRUE); clear_line(gn_win, 3, 20, TRUE); continue; } } /* check read permission */ if (up) { if (access(file, 0)) { beep(); mvwattrstr(gn_win, 4, 15, A_BOLD, "Can't find file"); wrefresh(gn_win); wait_key(gn_win, 3); clear_line(gn_win, 4, 15, TRUE); clear_line(gn_win, 3, 20, TRUE); continue; } if (access(file, 4)) { beep(); mvwattrstr(gn_win, 4, 15, A_BOLD, "No read permission"); wrefresh(gn_win); wait_key(gn_win, 3); clear_line(gn_win, 4, 15, TRUE); clear_line(gn_win, 3, 20, TRUE); continue; } break; } /* check write permission */ got_it = 0; switch(can_write(file)) { case DENIED: beep(); clear_line(gn_win, 4, 15, TRUE); mvwattrstr(gn_win, 4, 15, A_BOLD, "No write permission"); wrefresh(gn_win); wait_key(gn_win, 3); clear_line(gn_win, 4, 15, TRUE); clear_line(gn_win, 3, 20, TRUE); break; case OK_BUT_EXISTS: if (!yes_prompt(gn_win, 4, 15, A_BOLD, "File exists, overwrite")) { clear_line(gn_win, 4, 15, TRUE); clear_line(gn_win, 3, 20, TRUE); break; } /* fall thru */ case WRITE_OK: got_it++; break; } if (got_it) break; } werase(gn_win); wrefresh(gn_win); delwin(gn_win); return(list); } /* * Prompt for the Unix command line to be used as an external file * transfer program. Since expand() is used, it returns a pointer to * a static area. */ static char * get_extrnl(up) int up; { WINDOW *ge_win, *newwin(); char *ans, *cmd, *get_str(), *expand(); void st_line(); touchwin(stdscr); refresh(); st_line(""); /* prompt for command line */ ge_win = newwin(7, 70, 5, 5); mvwaddstr(ge_win, 3, 4, "Enter Unix command: "); box(ge_win, VERT, HORZ); if (up) mvwattrstr(ge_win, 0, 3, A_BOLD, " Send (external) "); else mvwattrstr(ge_win, 0, 3, A_BOLD, " Receive (external) "); wmove(ge_win, 3, 24); wrefresh(ge_win); /* get the line */ ans = get_str(ge_win, 60, "", "\n"); if (ans == NULL || *ans == '\0') cmd = NULL; else cmd = expand(ans); werase(ge_win); wrefresh(ge_win); delwin(ge_win); return(cmd); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.