home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 3 Comm / 03-Comm.zip / mincom15.zip / config.c < prev    next >
C/C++ Source or Header  |  1993-10-14  |  17KB  |  771 lines

  1. /*
  2.  * This file is part of the Minicom Communications Program,
  3.  * written by Miquel van Smoorenburg 1991/1992/1993.
  4.  */
  5. #include <sys/types.h>
  6. #if defined _POSIX_SOURCE || defined(_BSD43)
  7. #  include <unistd.h>
  8. #  include <stdlib.h>
  9. #endif
  10. #ifdef _MINIX
  11. #  undef NULL            /* Kludge */
  12. #endif
  13. #include <stdio.h>
  14. #include <setjmp.h>
  15. #ifdef _MINIX
  16. #  undef NULL            /* Kludge */
  17. #endif
  18. #include <string.h>
  19. #if defined (_MINIX) && !defined(NULL)
  20. #  define NULL ((void *)0)    /* Kludge */
  21. #endif
  22. #include <sys/stat.h>
  23. #if defined(_BSD43) || defined (_SYSV)
  24. #  define NOSTREAMS
  25. #  include <sys/file.h>
  26. #endif
  27. #include <ctype.h>
  28. #include "window.h"
  29. #include "minicom.h"
  30. #include "configsym.h"
  31. #include "keyboard.h"
  32. #include "vt100.h"
  33.  
  34. /*
  35.  * Configure minicom.
  36.  */
  37.  
  38. /*
  39.  * Read in parameters.
  40.  */
  41. void read_parms()
  42. {
  43.   FILE *fp;
  44.   int f;
  45.   char buf[64];
  46.   char *p;
  47.  
  48.   /* Read global parameters */
  49.   if ((fp = fopen(parfile, "r")) == (FILE *)NULL) {
  50.       if (real_uid == 0) {
  51.           fprintf(stderr,
  52.       "minicom: WARNING: configuration file not found, using defaults\n");
  53.           sleep(1);
  54. #ifdef _ACK
  55.         /* Initialize structure by hand */
  56.         readpars((FILE *)NULL, 1);
  57. #endif
  58.           return;
  59.       }
  60.       fprintf(stderr,
  61.     "minicom: there is no global configuration file %s\n", parfile);
  62.       fprintf(stderr, "Ask your sysadm to create one (with minicom -s).\n");
  63.       exit(1);
  64.   }
  65.   readpars(fp, 1);
  66.   fclose(fp);
  67.   /* Read personal parameters */
  68.   if ((fp = fopen(pparfile, "r")) != (FILE *)NULL) {
  69.     readpars(fp, 0);
  70.     fclose(fp);
  71.   }
  72.  
  73.   /* This code is to use old configuration files. */
  74.   for(f = PROTO_BASE; f < MAXPROTO; f++) {
  75.     if (P_PNAME(f)[0] && P_PIORED(f) != 'Y' && P_PIORED(f) != 'N') {
  76.         strcpy(buf, P_PNAME(f) - 2);
  77.         strcpy(P_PNAME(f), buf);
  78.         P_PIORED(f) = 'Y';
  79.         P_PFULL(f) = 'N';
  80.     }
  81.   }
  82.   p = basename(P_LOCK);
  83.   if (strncmp(p, "LCK", 3) == 0) *p = 0;
  84. }
  85.  
  86. /*
  87.  * See if we have write access to a file.
  88.  * If it is not there, see if the directory is writable.
  89.  */
  90. int waccess(s)
  91. char *s;
  92. {
  93.   char *p;
  94.   char buf[128];
  95.   struct stat stt;
  96.  
  97.   /* We use stat instead of access(s, F_OK) because I couldn't get
  98.    * that to work under BSD 4.3 ...
  99.    */
  100.   if (stat(s, &stt) == 0) {
  101.     if (access(s, W_OK) == 0)
  102.         return(A_OK_EXIST);
  103.     return(-1);
  104.   }
  105.   strcpy(buf, s);
  106.   if((p = strrchr(buf, '/')) == (char *)NULL)
  107.       strcpy(buf, ".");
  108.   else
  109.       *p = '\0';
  110.   if (access(buf, W_OK) == 0)
  111.     return(A_OK_NOTEXIST);
  112.   return(-1);
  113. }
  114.  
  115. /*
  116.  * Read in a string, but first check to see if it's
  117.  * allowed to do so.
  118.  */
  119. static void pgets(w, x, y, s, len, maxl)
  120. WIN *w;
  121. int x, y;
  122. char *s;
  123. int len;
  124. int maxl;
  125. {
  126.   struct pars *p = (struct pars *)s;
  127.  
  128.   if ((p->flags & PRIVATE) && real_uid != 0) {
  129.       werror("You are not allowed to change this parameter");
  130.       return;
  131.   }
  132.   wlocate(w, x, y);
  133.   (void) wgets(w, s, len, maxl);
  134.   p->flags |= CHANGED;
  135. }
  136.  
  137. /*
  138.  * Mark a variable as changed.
  139.  */
  140. static void markch(s)
  141. char *s;
  142. {
  143.   struct pars *p = (struct pars *)s;
  144.  
  145.   p->flags |= CHANGED;
  146. }
  147.  
  148. /*
  149.  * Set a string to a given value, but only if we're allowed to.
  150.  */
  151. static void psets(s, w)
  152. char *s, *w;
  153. {
  154.   struct pars *p = (struct pars *)s;
  155.  
  156.   if ((p->flags & PRIVATE) && real_uid != 0) {
  157.       werror("You are not allowed to change this parameter");
  158.       return;
  159.   }
  160.   strcpy(s, w);
  161.   p->flags |= CHANGED;
  162. }
  163.  
  164. /*
  165.  * Get a a character from the keyboard. Translate lower
  166.  * to uppercase and '\r' to '\n'.
  167.  */
  168. static int rgetch()
  169. {
  170.   int c;
  171.  
  172.   c = getch();
  173.   if (islower(c)) c = toupper(c);
  174.   if (c == '\n' || c == '\r' || c == '\033') return('\n');
  175.   return(c);
  176. }
  177.  
  178. static void dopath()
  179. {
  180.   WIN *w;
  181.   int c;
  182.   
  183.   w = wopen(5, 5, 75, 11, BDOUBLE, stdattr, MFG, MBG, 0, 0, 1);
  184.   wprintf(w, " A - Download directory : %.44s\n", P_DOWNDIR);
  185.   wprintf(w, " B -   Upload directory : %.44s\n", P_UPDIR);
  186.   wprintf(w, " C -   Script directory : %.44s\n", P_SCRIPTDIR);
  187.   wprintf(w, " D -     Script program : %.44s\n", P_SCRIPTPROG);
  188.   wprintf(w, " E -     Kermit program : %.44s\n", P_KERMIT);
  189.   wlocate(w, 4, 7);
  190.   wputs(w, "Change which setting? ");
  191.  
  192.   wredraw(w, 1);
  193.  
  194.   while(1) {
  195.       wlocate(w, 26, 7);
  196.       c = rgetch();
  197.       switch(c) {
  198.       case '\n':
  199.           wclose(w, 1);
  200.           return;
  201.       case 'A':
  202.           pgets(w, 26, 0, P_DOWNDIR, 64, 64);
  203.           break;
  204.       case 'B':
  205.           pgets(w, 26, 1, P_UPDIR, 64, 64);
  206.           break;
  207.       case 'C':
  208.           pgets(w, 26, 2, P_SCRIPTDIR, 64, 64);
  209.           break;
  210.       case 'D':
  211.           pgets(w, 26, 3, P_SCRIPTPROG, 64, 64);
  212.           break;
  213.       case 'E':
  214.           pgets(w, 30, 0, P_KERMIT, 64, 64);
  215.           break;
  216.       default:
  217.           break;
  218.       }
  219.   }
  220. }
  221.  
  222. char *yesno(k)
  223. int k;
  224. {
  225.   return(k ? "Yes" : "No ");
  226. }
  227.  
  228. /*
  229.  * Input the definition of an up/download protocol.
  230.  */
  231. static void inputproto(w, n)
  232. WIN *w;
  233. int n;
  234. {
  235.   int c = 0;
  236.  
  237.   mpars[PROTO_BASE + n].flags |= CHANGED;
  238.  
  239.   if (P_PNAME(n)[0] == '\0') {
  240.       P_PNN(n) = 'Y';
  241.       P_PUD(n) = 'U';
  242.     P_PFULL(n) = 'N';
  243.     P_PPROG(n)[0] = 0;
  244.     P_PIORED(n) = 'Y';
  245.       wlocate(w, 4, n+1);
  246.       wputs(w, "       ");
  247.   }
  248.   wlocate(w, 4, n+1);
  249.   (void ) wgets(w, P_PNAME(n), 10, 64);
  250.   pgets(w, 15, n+1, P_PPROG(n), 31, 64);
  251.   do {
  252.     wlocate(w, 48, n+1);
  253.     wprintf(w, "%c", P_PNN(n));
  254.     c = rgetch();
  255.     if (c == 'Y') P_PNN(n) = 'Y';
  256.     if (c == 'N') P_PNN(n) = 'N';
  257.   } while(c != '\r' && c != '\n');
  258.   do {
  259.     wlocate(w, 56, n+1);
  260.     wprintf(w, "%c", P_PUD(n));
  261.     c = rgetch();
  262.     if (c == 'U') P_PUD(n) = 'U';
  263.     if (c == 'D') P_PUD(n) = 'D';
  264.   } while(c != '\r' && c != '\n');
  265.   do {
  266.     wlocate(w, 64, n+1);
  267.     wprintf(w, "%c", P_PFULL(n));
  268.     c = rgetch();
  269.     if (c == 'Y') P_PFULL(n) = 'Y';
  270.     if (c == 'N') P_PFULL(n) = 'N';
  271.   } while(c != '\r' && c != '\n');
  272.   do {
  273.     wlocate(w, 72, n+1);
  274.     wprintf(w, "%c", P_PIORED(n));
  275.     c = rgetch();
  276.     if (c == 'Y') P_PIORED(n) = 'Y';
  277.     if (c == 'N') P_PIORED(n) = 'N';
  278.   } while(c != '\r' && c != '\n');
  279. }
  280.  
  281. static void doproto()
  282. {
  283.   WIN *w;
  284.   int f, c;
  285.  
  286.   w = wopen(1, 4, 78, 18, BDOUBLE, stdattr, MFG, MBG, 0, 0, 1);
  287.   wputs(w, "     Name             Program");
  288.   wlocate(w, 44, 0);
  289.   wputs(w, "Need name Up/Down FullScr IO-Red.");
  290.   for(f = 0; f < 12; f++) {
  291.      wlocate(w, 1, f+1);
  292.      if (P_PNAME(f)[0])
  293.       wprintf(w, "%c  %-10.10s %-31.31s  %c       %c       %c       %c",
  294.         'A' + f,
  295.           P_PNAME(f), P_PPROG(f),
  296.           P_PNN(f), P_PUD(f),
  297.         P_PFULL(f), P_PIORED(f));
  298.      else
  299.         wprintf(w, "%c    -", 'A' + f);
  300.   }
  301.   wlocate(w, 3, 14);
  302.   wputs(w, "Change which setting? (SPACE to delete) ");
  303.   wredraw(w, 1);
  304.  
  305.   do {
  306.       wlocate(w, 43, 14);
  307.       c = rgetch();
  308.       if (c >= 'A' && c <= 'L') inputproto(w, c - 'A');
  309.       if (c == ' ') {
  310.           wlocate(w, 3, 14);
  311.           wputs(w, "Delete which protocol? ");
  312.           wclreol(w);
  313.           c = rgetch();
  314.           if (c >= 'A' && c <= 'L') {
  315.               P_PNAME(c - 'A')[0] = '\0';
  316.               mpars[PROTO_BASE + (c - 'A')].flags |= CHANGED;
  317.               wlocate(w, 3, c - 'A' + 1);
  318.               wclreol(w);
  319.               wputs(w, "   -");
  320.           }
  321.         wlocate(w, 3, 14);
  322.         wputs(w, "Change which setting? (SPACE to delete) ");
  323.         c = ' ';
  324.     }
  325.   } while(c != '\n');
  326.   wclose(w, 1);
  327. }
  328.  
  329. static void doserial()
  330. {
  331.   WIN *w;
  332.  
  333.   w = wopen(5, 5, 75, 11, BDOUBLE, stdattr, MFG, MBG, 0, 0, 1);
  334.   wprintf(w, " A -    Serial Device : %.46s\n", P_PORT);
  335.   wprintf(w, " B - Lockfile Location: %.46s\n", P_LOCK);
  336.   wprintf(w, " C -   Callin Program : %.46s\n", P_CALLIN);
  337.   wprintf(w, " D -  Callout Program : %.46s\n", P_CALLOUT);
  338.   wprintf(w, " E -    Baud/Par/Bits : %s %s%s1\n", P_BAUDRATE,
  339.       P_BITS, P_PARITY);
  340.   wlocate(w, 4, 6);
  341.   wputs(w, "Change which setting? ");
  342.   wredraw(w, 1);
  343.  
  344.   while(1) {
  345.       wlocate(w, 26, 6);
  346.       switch(rgetch()) {
  347.       case '\n':
  348.           wclose(w, 1);
  349.           return;
  350.       case 'A':
  351.           pgets(w, 24, 0, P_PORT, 64, 64);
  352.           break;
  353.       case 'B':
  354.           pgets(w, 24, 1, P_LOCK, 64, 64);
  355.           break;
  356.       case 'C':
  357.           pgets(w, 24, 2, P_CALLIN, 64, 64);
  358.           break;
  359.       case 'D':
  360.           pgets(w, 24, 3, P_CALLOUT, 64, 64);
  361.           break;
  362.       case 'E':
  363.           get_bbp(P_BAUDRATE, P_BITS, P_PARITY);
  364.           if (portfd >= 0)
  365.             m_setparms(portfd, P_BAUDRATE, P_PARITY, P_BITS);
  366.           wlocate(w, 24, 4);
  367.         wprintf(w, "%s %s%s1  \n", P_BAUDRATE, P_BITS, P_PARITY);
  368.         if (st != NIL_WIN) mode_status();
  369.         markch(P_BAUDRATE);
  370.         markch(P_BITS);
  371.         markch(P_PARITY);
  372.         break;
  373.       default:
  374.           break;
  375.       }    
  376.   }
  377. }
  378.  
  379. static void domodem()
  380. {
  381.   WIN *w;
  382.   char *str;
  383.   int c, x, y, ypos, maxl;
  384.  
  385.   w = wopen(2, 2, 77, 21, BDOUBLE, stdattr, MFG, MBG, 0, 0, 1);
  386.  
  387.   dirflush = 0;
  388.   wtitle(w, TMID, "Modem and dialing parameter setup");
  389.   wprintf(w, "\n");
  390.   wprintf(w, " A - Init string ......... %.48s\n", P_MINIT);
  391.   wprintf(w, " B - Reset string ........ %.48s\n", P_MRESET);
  392.   wprintf(w, " C - Dialing prefix #1.... %.48s\n", P_MDIALPRE);
  393.   wprintf(w, " D - Dialing suffix #1.... %.48s\n", P_MDIALSUF);
  394.   wprintf(w, " E - Dialing prefix #2.... %.48s\n", P_MDIALPRE2);
  395.   wprintf(w, " F - Dialing suffix #2.... %.48s\n", P_MDIALSUF2);
  396.   wprintf(w, " G - Dialing prefix #3.... %.48s\n", P_MDIALPRE3);
  397.   wprintf(w, " H - Dialing suffix #3.... %.48s\n", P_MDIALSUF3);
  398.   wprintf(w, " I - Connect string ...... %.48s\n", P_MCONNECT);
  399.   wprintf(w, " J - No connect strings .. %-20.20s  %.20s\n", P_MNOCON1, P_MNOCON2);
  400.   wlocate(w, 27, 11);
  401.   wprintf(w, "%-20.20s  %.20s\n", P_MNOCON3, P_MNOCON4);
  402.   wprintf(w, " K - Hang-up string ...... %.48s\n", P_MHANGUP);
  403.   wprintf(w, " L - Dial cancel string .. %.48s\n", P_MDIALCAN);
  404.   wprintf(w, "\n");
  405.   wprintf(w, " M - Dial time ........... %.3s\n", P_MDIALTIME);
  406.   wprintf(w, " N - Delay before redial . %.3s\n", P_MRDELAY);
  407.   wprintf(w, " O - Number of tries ..... %.3s\n", P_MRETRIES);
  408.   wlocate(w, 34, 15);
  409.   wprintf(w, " P - Auto baud detect .... %s\n", P_MAUTOBAUD);
  410.   wlocate(w, 34, 16);
  411.   wprintf(w, " Q - Drop DTR to hangup .. %s\n", P_MDROPDTR);
  412.   wlocate(w, 34, 17);
  413.   wprintf(w, " R - Modem has DCD line .. %s\n", P_HASDCD);
  414.  
  415.   wlocate(w, 1, 19);
  416.   wprintf(w, " Change which setting? ");
  417.   x = w->curx; y = w->cury;
  418.   wprintf(w, "      (Return or Esc to exit)");
  419.   wredraw(w, 1);
  420.  
  421.   while(1) {
  422.       wlocate(w, x, y);
  423.       wflush();
  424.       c = rgetch();
  425.       ypos = 1;
  426.     maxl = 64;
  427.       switch(c) {
  428.           case 'M':
  429.           case 'N':
  430.           case 'O':
  431.               ypos++;
  432.             maxl = 4;
  433.           case 'K':
  434.           case 'L':
  435.               ypos -= 2;
  436.               c += 3;
  437.           case 'A':
  438.           case 'B':
  439.           case 'C':
  440.           case 'D':
  441.           case 'E':
  442.         case 'F':
  443.         case 'G':
  444.         case 'H':
  445.         case 'I':
  446.               /* Calculate adress of string tomodify */
  447.               str = P_MINIT + (c - 'A') * sizeof(struct pars);
  448.               pgets(w, 27, ypos + (c - 'A'), str, maxl, maxl);
  449.               break;
  450.           case 'J':
  451.               /* Walk through all four */
  452.               pgets(w, 27, 10, P_MNOCON1, 20, 64);
  453.               pgets(w, 49, 10, P_MNOCON2, 20, 64);
  454.               pgets(w, 27, 11, P_MNOCON3, 20, 64);
  455.               pgets(w, 49, 11, P_MNOCON4, 20, 64);
  456.               break;
  457.           case 'P':
  458.               psets(P_MAUTOBAUD, yesno(P_MAUTOBAUD[0] == 'N'));
  459.               wlocate(w, 61, 15);
  460.               wputs(w, P_MAUTOBAUD);
  461.               break;
  462.           case 'Q':
  463.               psets(P_MDROPDTR, yesno(P_MDROPDTR[0] == 'N'));
  464.               wlocate(w, 61, 16);
  465.               wputs(w, P_MDROPDTR);
  466.               break;
  467.           case 'R':
  468.               psets(P_HASDCD, yesno(P_HASDCD[0] == 'N'));
  469.               wlocate(w, 61, 17);
  470.               wputs(w, P_HASDCD);
  471.               break;
  472.           case '\n':
  473.               dirflush = 1;
  474.               wclose(w, 1);
  475.               return;
  476.           default:
  477.               break;    
  478.       }
  479.   }
  480. }
  481.  
  482.  
  483. /*
  484.  * Screen and keyboard menu.
  485.  */
  486. static void doscrkeyb()
  487. {
  488.   WIN *w;
  489.   int c;
  490.   int clr = 1;
  491.   char buf[16];
  492.  
  493.   w = wopen(15, 8, 65, 14, BDOUBLE, stdattr, MFG, MBG, 0, 0, 1);
  494.   
  495.   wtitle(w, TMID, "Screen and keyboard");
  496.   wprintf(w, "\n A - Command key is      : %s\n", P_ESCAPE);
  497.   wprintf(w, " B - Backspace key sends : %s\n", P_BACKSPACE);
  498.   wprintf(w, " C - Status line is      : %s", P_STATLINE);
  499.   wredraw(w, 1);
  500.  
  501.   while(1) {
  502.       if (clr) {
  503.           wlocate(w, 2, 5);
  504.         wputs(w, "Change which setting?  (Esc to exit) ");
  505.         wclreol(w);
  506.         clr = 0;
  507.     } else
  508.           wlocate(w, 39, 5);
  509.       switch(rgetch()) {
  510.           case '\n':
  511.               wclose(w, 1);
  512.               return;
  513.           case 'A':
  514.               wlocate(w, 2, 5);
  515. #if defined (_MINIX) || defined (_COHERENT) || defined (linux)
  516.               wputs(w, "Press new escape key, SPACE for ALT: ");
  517.               if ((c = getch()) == ' ')
  518.                   strcpy(buf, "ALT");
  519.               else
  520.                   sprintf(buf, "^%c", (c & 0x1f) + 'A' - 1);
  521. #else
  522.               wputs(w, "Press new escape key, SPACE for MetaKey: ");
  523.               if ((c = getch()) == ' ')
  524.                   strcpy(buf, "meta key");
  525.               else
  526.                   sprintf(buf, "^%c", (c & 0x1f) + 'A' - 1);
  527. #endif
  528.               psets(P_ESCAPE, buf);
  529.               wlocate(w, 27, 1);
  530.               wputs(w, P_ESCAPE);
  531.               if (c != ' ') wputs(w, "        ");
  532.               clr = 1;
  533.               if (st) {
  534.                   /*
  535.                    * If minicom was called with the '-s' option,
  536.                    * keyserv does not run yet. We can see this
  537.                    * because the status line is not initialized
  538.                    * at that time, either.
  539.                    */
  540.                 keyboard(KSETESC, P_ESCAPE[0] == '^' ?
  541.                     P_ESCAPE[1] & 31 : 128);
  542.                   show_status();
  543.               }
  544.               alt_override = 0;
  545.               break;
  546.           case 'B':
  547.               if (P_BACKSPACE[0] == 'D')
  548.                   psets(P_BACKSPACE, "BS");
  549.               else
  550.                   psets(P_BACKSPACE, "DEL");
  551.               wlocate(w, 27, 2);
  552.               wprintf(w, "%s ", P_BACKSPACE);
  553.               if (st)
  554.                 keyboard(KSETBS, P_BACKSPACE[0] == 'B' ?
  555.                                 8 : 128);
  556.               break;
  557.           case 'C':
  558.               if (P_STATLINE[0] == 'e') {
  559.                   psets(P_STATLINE, "disabled");
  560.                   tempst = 1;
  561.               } else {
  562.                   psets(P_STATLINE, "enabled");
  563.                   /* See if it fits on screen */
  564.                   if (LINES > 24 + (terminal == MINIX))
  565.                       tempst = 0;
  566.               }
  567.               wlocate(w, 27, 3);
  568.               wprintf(w, "%s ", P_STATLINE);
  569.               break;
  570.       }
  571.   }
  572. }
  573.  
  574. /*
  575.  * Save the configuration.
  576.  */
  577. static void dodflsave()
  578. {
  579.   FILE *fp;
  580.   int am;
  581.  
  582.   /* Root saves new configuration */
  583.   if (real_uid == 0) {
  584.       if ((fp = fopen(parfile, "w")) == (FILE *)NULL) {
  585.           werror("Cannot write to %s", parfile);
  586.           return;
  587.       }
  588.       writepars(fp, 1);
  589.   } else {
  590.     /* Mortals save their own configuration */
  591.     if ((am = waccess(pparfile)) < 0 ||
  592.         (fp = fopen(pparfile, "w")) == (FILE *)NULL) {
  593.           werror("Cannot write to %s", pparfile);
  594.           return;
  595.     }
  596. #ifndef DEBUG
  597. #ifndef HAS_FCHOWN
  598.     if (am == A_OK_NOTEXIST) chown(pparfile, real_uid, real_gid);
  599. #else
  600.     if (am == A_OK_NOTEXIST) fchown(fileno(fp), real_uid, real_gid);
  601. #endif
  602.     writepars(fp, 0);
  603. #endif
  604.   }
  605.   fclose(fp);
  606.   werror("Configuration saved");
  607. }
  608.  
  609. /*
  610.  * Save the configuration, ask a name for it.
  611.  */
  612. static void donamsave()
  613. {
  614.   char ifile[128];
  615.   char *s;
  616.  
  617.   if (real_uid != 0) {
  618.       werror("You are not allowed to create a configuration");
  619.     return;
  620.   }
  621.  
  622.   ifile[0] = 0;
  623.   s = input("Give name to save this configuration?", ifile);
  624.   if (s != (char *)0 && *s != 0) {
  625.       sprintf(parfile, "%s/minirc.%s", LIBDIR, s);
  626.   dodflsave();
  627.   }
  628. }
  629.  
  630. static void (*funcs1[])() = {
  631.   dopath,
  632.   doproto,
  633.   doserial,
  634.   domodem,
  635.   doscrkeyb,
  636.   dodflsave,
  637.   donamsave,
  638.   NIL_FUN,
  639.   NIL_FUN,
  640. };
  641.  
  642. char some_string[32];
  643.  
  644. static char *menu1[] = {
  645.   "Filenames and paths",
  646.   "File transfer protocols",
  647.   "Serial port setup",
  648.   "Modem and dialing",
  649.   "Screen and keyboard",
  650.   some_string,
  651.   "Save setup as..",
  652.   "Exit",
  653.   "Exit from Minicom",
  654.   MENU_END,
  655. };
  656.  
  657.  
  658. int config(setup)
  659. int setup;
  660. {
  661.   int c;
  662.   char *s;
  663.  
  664.   /* Find out extension of parameter file */
  665.   s = parfile + strlen(LIBDIR) + 8;
  666.   sprintf(some_string, "Save setup as %s", s);
  667.  
  668.   if (!setup) menu1[8] = MENU_END;
  669.  
  670.   c = wselect(13, 10, menu1, funcs1, "configuration", stdattr, MFG, MBG);
  671.   if (c == 9) return(1);
  672.   return(0);
  673. }
  674.  
  675. static char *speeds[] =
  676.    { "300", "1200", "2400", "4800", "9600", "19200", "38400", };
  677.  
  678. /*
  679.  * Ask user for Baudrate, Bits and Parity
  680.  */
  681. void get_bbp(ba, bi, pa)
  682. char *ba;
  683. char *bi;
  684. char *pa;
  685. {
  686.   int c;
  687.   WIN *w;
  688.   int x, y;
  689.  
  690.   w = wopen(21, 6, 60, 19, BDOUBLE, stdattr, MFG, MBG, 0, 0, 1);
  691.   wtitle(w, TMID, "Comm Parameters");
  692.  
  693.   dirflush = 0;
  694.  
  695.   wlocate(w, 0, 3);
  696.   wputs(w, "   Speed          Parity          Data\n\n");
  697.   wputs(w, " A: 300           H: None         M: 5\n");
  698.   wputs(w, " B: 1200          I: Even         N: 6\n");
  699.   wputs(w, " C: 2400          J: Odd          O: 7\n");
  700.   wputs(w, " D: 4800                          P: 8\n");
  701.   wputs(w, " E: 9600\n");
  702.   wputs(w, " F: 19200         K: 8-N-1\n");
  703.   wputs(w, " G: 38400         L: 7-E-1\n");
  704.   wputs(w, "\n Choice, or <Enter> to exit? ");
  705.   x = w->curx;
  706.   y = w->cury;
  707.   
  708.   bi[1] = 0;
  709.   pa[1] = 0;
  710.  
  711.   wredraw(w, 1);
  712.  
  713.   while(1) {
  714.       wlocate(w, 1, 1);
  715.       wprintf(w, "Current: %5s %s%s1  ", ba, bi, pa);
  716.       wlocate(w, x, y);
  717.       wflush();
  718.       c = getch();
  719.       if (c >= 'a') c -= 32;
  720.       switch(c) {
  721.           case 'A':
  722.           case 'B':
  723.           case 'C':
  724.           case 'D':
  725.           case 'E':
  726.           case 'F':
  727.           case 'G':
  728.               strcpy(ba, speeds[c - 'A']);
  729.               break;
  730.           case 'H':
  731.               pa[0] = 'N';
  732.               break;
  733.           case 'I':
  734.               pa[0] = 'E';
  735.               break;
  736.           case 'J':
  737.               pa[0] = 'O';
  738.               break;
  739.           case 'K':    
  740.               pa[0] = 'N';
  741.               bi[0] = '8';
  742.               break;
  743.           case 'L':
  744.               pa[0] = 'E';
  745.               bi[0] = '7';
  746.               break;
  747.           case 'M':
  748.               bi[0] = '5';
  749.               break;
  750.           case 'N':
  751.               bi[0] = '6';
  752.               break;
  753.           case 'O':
  754.               bi[0] = '7';
  755.               break;
  756.           case 'P':
  757.               bi[0] = '8';
  758.               break;
  759.           case 27:
  760.           case '\n':
  761.           case '\r':
  762.               dirflush = 1;
  763.               wclose(w, 1);
  764.               return;
  765.           default:
  766.               break;
  767.       }
  768.   }
  769. }
  770.  
  771.