home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / tterm_src.lzh / sterm.c < prev    next >
Text File  |  1996-03-10  |  18KB  |  739 lines

  1. /*********************************************************************
  2. sterm.c - main module for tterm
  3. *********************************************************************/
  4. #include "common.h"
  5. #include "sterm.h"
  6. #ifdef GWINDOWS
  7. #   include <window.h>
  8. #   define WFM_PRIORITY 47000
  9. #endif
  10.  
  11. extern void
  12.     *_glob_data;        /* _os_intercept needs this (undocumented feature?) */
  13. extern void
  14.     trap(int),          /* signal trap module */
  15.     dskout(int),
  16.     opendsk(),
  17.     FileTransfer(),
  18.     closdsk();
  19. extern int
  20.     max_err;
  21.  
  22. int (*DoCleanup)(),
  23.     (*DoProcess)();
  24.     
  25. char *XYProg = "xyt";   /* XY transfer program */
  26. u_char filterbyte=0x7F; /* filter for high bit */
  27.  
  28. /*********************************************************************
  29. MAIN
  30. *********************************************************************/
  31. main(argc, argv)
  32. int   argc;
  33. char  **argv;
  34. {
  35. int option;
  36. u_int32 c;
  37. int lastchar;
  38. int cistate = CIDLE;
  39. char *p;
  40. u_int32 size=0;             /* number of characters in screen buffer */
  41. u_int32 
  42.     snooze,
  43.     writehere;          /* write out screen buffer here */
  44. signal_code
  45.     wakeup;
  46.  
  47. to_floppy = TRUE;       /* keep this so we don;t mess with the B Plus stuff */
  48.  
  49. if(ParseParms(argc,argv) == -1)
  50.     exit(0);
  51. if(mport == 0)      /* if no port defined */
  52.     {
  53.     mport=getenv("MODEM");
  54.     if(mport == NULL)
  55.         {
  56.         fprintf(stderr,"No MODEM port defined!\n");
  57.         exit(0);
  58.         }
  59.     }
  60.  
  61. _os_intercept(trap,_glob_data);     /* set up interrupt handler */
  62.  
  63. g_tickrate=CLOCKS_PER_SEC;  /* system heartbeat */
  64. if(modsetup(mport) != 0)    /* open and set up modem path */
  65.     {
  66.     cleanup();
  67.     exit(errno);
  68.     }
  69. if(termsetup() != 0)        /* configure stdin for terminal action */
  70.     {
  71.     cleanup();
  72.     exit(errno);
  73.     }
  74.  
  75. T_PutC = ToScreen;
  76. CopyRight();
  77. SetDialerFile();
  78. SetPriority();
  79. if(LoadTransfer(XYProg) == 0)
  80.     SetLogFile();
  81. DoProcess = NullProcess;
  82. DoCleanup = NullProcess;
  83.  
  84. t_puts("\012\n\012***** TTERM is Ready *****\012\n\012");
  85.  
  86. /*
  87.  * Loop forever reading the modem port and perfoming functions as needed
  88.  */
  89. while(1)
  90.     {
  91.     if(ModemReady())                /* if data waiting in the buffer */
  92.         {
  93.         c=(m_getc() & filterbyte);
  94.         switch (c)
  95.             {
  96.             case ENQ :             /* Starting B+ transfer */
  97.                 lastchar = c;       /* save last rcvd char */
  98.                 bp_ENQ();
  99.                 break;
  100.             case DLE :
  101.                 if (lastchar == ENQ)    /* MUST follow an ENQ */
  102.                     {
  103.                     c = bp_DLE(to_floppy);
  104.                     cistate = CIDLE;    /* Return to normal */
  105.                     }
  106.                 else
  107.                     {
  108.                 ToScreen(lastchar);
  109.                 ToScreen(c);
  110.                 }
  111.                 break;
  112.             case 0:
  113.                 break;
  114.             default:
  115.                 T_PutC(c);          /* send to buffer for output */
  116.                 break;
  117.             }
  118.         }           /* endif modem ready */
  119.  
  120.     else if(TermReady())            /* if there is something there */
  121.         {                           
  122.         g_sigkb = 0;
  123.         c = inkey();                /* go get it */
  124.         option = scankey(c);
  125.         if (option)                 /* if command key */
  126.             internal(option);       /* check for command */
  127.         else
  128.             {
  129.             m_putc(c);              /* send to modem */
  130.             if (echoflg)            /* if half-duplex echo to screen */
  131.                 ToScreen(c);
  132.             }
  133.         } /* endif (TermReady()) */
  134.     else
  135.         {
  136.         if(nextphase == TRUE)
  137.             {
  138.             nextphase = FALSE;
  139.             DoCleanup();
  140.             DoCleanup = NullProcess;
  141.             DoProcess = NullProcess;
  142.             T_PutC = ToScreen;
  143.             }
  144.         DoProcess();
  145.         WaitSerial(1);
  146.         }
  147.     } /* End of Loop Forever */
  148. } /* End of Main */
  149.  
  150. /*********************************************************************
  151. NULL functions
  152. *********************************************************************/
  153. NullProcess() { }
  154.  
  155. /**********************************************************************
  156. SCAN the KEYcodes
  157.    returns offset to key pressed
  158.    0 if not in keycodes[];
  159. **********************************************************************/
  160. int scankey(kp)
  161. int   kp;
  162. {
  163. int   cntr;
  164.  
  165. if(kp==0)
  166.     return 0;
  167. for(cntr=0;cntr<MAXCODES;cntr++)
  168.    {
  169.    if(keycodes[cntr] == kp) 
  170.       return cntr+1;
  171.    }
  172. return 0;
  173. }
  174.  
  175. /*********************************************************************
  176. INTERNAL commnad handler
  177. *********************************************************************/
  178. internal(c)
  179. int   c;
  180. {
  181. extern char *KU,*KD,*KL,*KR;
  182.  
  183. switch (c)
  184.     {
  185.     case CAPTURE :
  186.         if (capflg)
  187.             closdsk();
  188.         else
  189.             opendsk();
  190.         break;
  191.     case DIAL:
  192.         Dialer();
  193.         break;
  194.     case ECHO :
  195.         toggleduplex();
  196.         break;
  197.     case SHELL:
  198.         shell();
  199.         break;
  200.     case TRANSFER:
  201.         FileTransfer(XYProg,mport);
  202.         break;
  203.     case TRANSMIT :
  204.         transmit();
  205.         break;
  206.     case DIR :
  207.         cwd();
  208.         break;
  209.     case HELP :
  210.         tprint(CL);
  211.         help();
  212.         break;
  213.     case FILTER:
  214.         if(filterbyte == 0xFF)
  215.             {
  216.             filterbyte=0x7F;
  217.             tprint("High bit filter on!\012\n");
  218.             }
  219.         else
  220.             {
  221.             filterbyte=0xFF;
  222.             tprint("High bit filter off!\012\n");
  223.             }
  224.         break;
  225.     case TRANSLST:
  226.         SetFileList();
  227.         break;
  228.     case TRANSFIL:
  229.         SetTransferFile();
  230.         break;
  231.     case QUIT:
  232.         if (getans("\012\nQUIT - are you sure? ") == TRUE)
  233.             {
  234.             t_puts(CL);
  235.             cleanup();
  236.             exit(0);
  237.             }
  238.         break;
  239.     case UPARR:
  240.         m_puts(KU);
  241.         break;
  242.     case DNARR:
  243.         m_puts(KD);
  244.         break;
  245.     case LFARR:
  246.         m_puts(KL);
  247.         break;
  248.     case RTARR:
  249.         m_puts(KR);
  250.         break;
  251.     default:
  252.         m_putc(c);                     /* and then send the next char */
  253.     }
  254. }
  255.  
  256. /*********************************************************************
  257. HELP message
  258. *********************************************************************/
  259. help()
  260. {
  261. static char *hlpmsg[] = {
  262. F1_M,F7_M,
  263. F2_M,F8_M,
  264. F3_M,F9_M,
  265. F4_M,F0_M,
  266. F5_M,FA_M,
  267. F6_M,FB_M,
  268. BLNK,BLNK,
  269. 0 };
  270.  
  271. int
  272.     cntr;
  273. char
  274.     *margin = "         ",  /* nine spaces */
  275.     buff[80],
  276.     **hscan=hlpmsg;
  277.  
  278. buff[0]=glyph[5];
  279. for(cntr=1; cntr < LASTGLYPH; cntr++)
  280.     buff[cntr]=glyph[6];
  281. buff[LASTGLYPH]=glyph[2];
  282. buff[LASTGLYPH + 1]=0;
  283. tprint(margin);tprint(buff); tprint("\012\n");
  284.  
  285. while(**hscan)
  286.     {
  287.     sprintf(buff,"%c%s%s%c\012\n",glyph[1],*hscan,*(hscan+1),glyph[1]);
  288.     tprint(margin);tprint(buff);
  289.     hscan += 2;
  290.     }
  291. sprintf(buff,"%c  Connected to port %-5s      Baud Rate: %-14s  %c\012\n",
  292.     glyph[1],mport,GetBaud(),glyph[1]);
  293. tprint(margin);tprint(buff);
  294.  
  295. buff[0]=glyph[4];
  296. for(cntr=1; cntr < LASTGLYPH; cntr++)
  297.     buff[cntr]=glyph[6];
  298. buff[LASTGLYPH]=glyph[3];
  299. buff[LASTGLYPH + 1]=0;
  300. tprint(margin);tprint(buff); tprint("\012\n");
  301. }
  302.  
  303. /*********************************************************************
  304. display the COPYRIGHT message
  305. *********************************************************************/
  306. CopyRight()
  307. {
  308. static char *copyrite[]={
  309. "Tterm - a simple terminal program for OS9 and OS9000\012\n",
  310. "Modified from Mark Griffith's Original Source Code\012\n",
  311. "by Ed Gresick and Stephen Carville\012\n"
  312. "Version ",_VERSION," by Stephen Carville\012\n",
  313. "High G Software P.O. Box 822 Glendora, CA 91740\012\n",
  314. "\012\n",
  315. 0};
  316. char **s;
  317.  
  318. s=copyrite;
  319. tprint(CL);
  320. while(**s != 0)
  321.     tprint(*s++);
  322. help();
  323. }
  324.  
  325. /*********************************************************************
  326. program USAGE
  327. *********************************************************************/
  328. usage()
  329. {
  330. fprintf(stderr, "\nTterm Version %s\n\n",_VERSION);
  331. fprintf(stderr, "Usage:  tterm <options>\n");
  332. fprintf(stderr, "   -?      Print this usage message\n");
  333. fprintf(stderr, "   -l[=]p  Link to modem port 'p'\n");
  334. fprintf(stderr, "           defaults to MODEM\n");
  335. }
  336.  
  337. /*********************************************************************
  338. CLOSE the capture FILE
  339. *********************************************************************/
  340. void close_file()
  341. {
  342. if (cp_pn != 0x00)    /* bloop */
  343.     {
  344.     dskout(-1);
  345.     fclose(cp_pn);       /* and close it */
  346.     } 
  347. }
  348.  
  349. /*********************************************************************
  350. DiSK OUTput - pass c as -1 to force a flush of buffer
  351. *********************************************************************/
  352. void dskout(c)
  353. int c;
  354. {
  355. char khar;
  356. int stopped=0;
  357.  
  358. static int inbuff=0;
  359. static char *dbip=diskbuff;
  360.  
  361. if(c == -1)             /* if a forced flush */
  362.     {
  363.     fwrite(diskbuff,1,inbuff,cp_pn);
  364.     fflush(cp_pn);      /* And write out the buffer */
  365.     dbip=diskbuff;      /* reset */
  366.     inbuff=0;
  367.     return;
  368.     }
  369.  
  370. khar=c;
  371. if(khar >= 0x20)
  372.     *dbip++=khar;
  373. else if(khar == BACKSP || khar == CR || khar == TAB)
  374.     *dbip++=khar;
  375. else
  376.     return;
  377.  
  378. inbuff++;
  379. }
  380.  
  381. /*********************************************************************
  382. CLOSe the capture to DiSK - asks if file to be closed
  383. *********************************************************************/
  384. void closdsk()
  385. {
  386. if (cp_pn == 0x00)   /* bloop */
  387.     {
  388.     tprint(" FILE NOT OPENED\012\n");
  389.     capflg = FALSE;
  390.     }
  391. else
  392.     {
  393.     dskout(-1);
  394.     capflg = FALSE;
  395.     if (getans("Close File? ") == TRUE)
  396.         {
  397.         fclose(cp_pn);
  398.         cp_pn = 0;
  399.         tprint("\012\nCapture Off - File Closed\012\n");
  400.         }
  401.     else
  402.         tprint("\012\nCapture Off - File Remains Open\012\n");
  403.     }          
  404. }
  405.  
  406. /*********************************************************************
  407. OPEN capture to DiSK
  408. *********************************************************************/
  409. void opendsk()
  410. {
  411. int ansok;
  412. char cz;
  413. char *mode="w";         /* fiel access mode */
  414. char buff[80];
  415.  
  416. path_id path;
  417.  
  418. if(cp_pn != 0)          /* file already opened */
  419.     {
  420.     t_puts("\012\nCapture ON - File already opened\012\n");
  421.     capflg = TRUE;
  422.     return;
  423.     }
  424. else
  425.     {
  426.     t_puts("Filename: ");
  427.     t_gets(filename,sizeof(filename));
  428.     if(filename[0] == 0)
  429.         {
  430.         t_puts("No filename given\012\n");
  431.         return;
  432.         }
  433.     }
  434.  
  435. if(_os_open(filename,0,&path) == 0)     /* existing file? */
  436.     {
  437.     _os_close(path);
  438.     t_puts("\012\nFILE EXISTS - [O]verwrite, [A]ppend, or [RETURN]: ");
  439.     ansok = FALSE;
  440.  
  441.     while(ansok == FALSE)
  442.         {
  443.         cz = GetOneChar();
  444.  
  445.         switch (tolower(cz))
  446.             {
  447.             case 0x0d:
  448.                 t_puts("\012\nABORTED\012\n");
  449.                 return;
  450.             case 'o':
  451.                 t_puts("\012\nOverwriting...\012\n");
  452.                 ansok = TRUE;
  453.                 break;
  454.             case 'a':
  455.                 t_puts("\012\nAppending ...\012\n");
  456.                 mode="a";
  457.                 ansok = TRUE;
  458.             }
  459.         }
  460.     }
  461.  
  462. cp_pn=fopen(filename,mode);
  463. if(cp_pn == 0)
  464.     {
  465.     sprintf(buff,"Can't open '%s' - error %d %c!\012\n",filename, errno, 7);
  466.     tprint(buff);
  467.     cp_pn = 0;
  468.     capflg = FALSE;
  469.     }
  470. else
  471.     {
  472.     tprint("\nCapture ON - File Opened\012\n");
  473.     capflg = TRUE;
  474.     setvbuf(cp_pn,0,_IOFBF,VBUFFSIZ);
  475.     }
  476. }
  477.  
  478. /*********************************************************************
  479. TRANSMIT a file
  480. *********************************************************************/
  481. void transmit()
  482. {
  483. extern int TransmitLine(void),TransmitCleanup(void);
  484.  
  485. char buff[80];
  486.  
  487. t_puts("\012\nTransmit Filename: ");
  488. t_gets(filename,sizeof(filename));
  489. if(filename[0] == '\0')
  490.     {
  491.     t_puts("ABORTED - No Filename given\012\n");
  492.     return;
  493.     }
  494.  
  495. xmf=fopen(filename, "r");
  496. if(xmf == 0)
  497.     {
  498.     sprintf(buff,"CAN'T OPEN %s %c\012\n",filename,BELL);
  499.     t_puts(buff);
  500.     return;
  501.     }
  502. DoProcess = TransmitLine;
  503. DoCleanup = TransmitCleanup;
  504. t_puts(CL);
  505. }
  506.  
  507. /*********************************************************************
  508. TRANSMIT a LINE
  509. *********************************************************************/
  510. TransmitLine()
  511. {
  512. if(fgets(sbuf, MAXLIN, xmf) == NULL)    /* Get line to xmit */
  513.     nextphase = TRUE;
  514. else
  515.     m_puts(sbuf);           /* and send it out */
  516. }
  517.  
  518. /*********************************************************************
  519. TRANSMIT CLEANUP function
  520. *********************************************************************/
  521. TransmitCleanup()
  522. {
  523. fclose(xmf);
  524. t_puts("\012\nTransmit File Closed\012\n");
  525. }
  526.  
  527. /*********************************************************************
  528. GET a single character ANSwer from the keyboard
  529.     this had better not be called during any kind of a transfer!
  530. *********************************************************************/
  531. getans(s)
  532. char  *s;       /* prompt */
  533. {
  534. char  c;
  535.  
  536. t_puts(s);
  537. c = (char)GetOneChar();
  538. ToScreen(c);
  539. t_puts("\012\n");
  540. return (c == 'y');
  541. }
  542.  
  543. /*********************************************************************
  544. GET ONE CHARacter 
  545. *********************************************************************/
  546. GetOneChar()
  547. {
  548. u_int32 snooze;
  549. signal_code wakeup;
  550.  
  551. while (g_sigkb == 0)
  552.     {
  553.     snooze=10;
  554.     TSleep(snooze,wakeup);
  555.     }
  556. return inkey();
  557. }
  558.  
  559. /*********************************************************************
  560. GET FILE name
  561. *********************************************************************/
  562. int getfile()
  563. {
  564. t_gets(filename,sizeof(filename));
  565. return (filename[0] != '\0');
  566. }
  567.  
  568. /*********************************************************************
  569. Change the Working Directory
  570. *********************************************************************/
  571. cwd()
  572. {
  573. t_puts("\012\nNew Directory ? ");
  574. t_gets(filename,sizeof(filename));
  575.  
  576. if (filename[0] == '\0')
  577.     t_puts("ABORTED\012\n");
  578. else
  579.     {
  580.     if(_os_chdir(filename,FAM_READ | FAM_WRITE) != 0)
  581.         t_puts("Can't CHD\012\n");
  582.     else
  583.         t_puts("OK!\012\n");
  584.     }
  585. }
  586. /*********************************************************************
  587. execute a SHELL command
  588. *********************************************************************/
  589. shell()
  590. {
  591. t_puts("OS9: ");
  592. t_gets(sbuf,sizeof(sbuf));
  593. cook_io();
  594. system(sbuf);
  595. raw_io();
  596. t_puts("\012\n**** TTERM back online ****\012\n");
  597. FlushSerial();
  598. }
  599.  
  600. /*********************************************************************
  601. TOGGLE echo mode (DUPLEX)
  602. *********************************************************************/
  603. toggleduplex()
  604. {
  605. if (echoflg)
  606.     {
  607.     t_puts("\012\nFull duplex\012\n");
  608.     echoflg = FALSE;
  609.     }
  610. else
  611.     {
  612.     t_puts("\012\nHalf duplex\012\n");
  613.     echoflg = TRUE;
  614.     }
  615. }
  616.  
  617. /*********************************************************************
  618. ALARM RESET - resets an existing alarm returns new alarm_id
  619. *********************************************************************/
  620. AlarmReset(alarm_id alrm_id,signal_code signal,u_int32 time)
  621. {
  622. _os_alarm_delete(alrm_id);
  623. _os_alarm_set(&alrm_id,signal,time);
  624. return alrm_id;
  625. }
  626.  
  627.  
  628. /*********************************************************************
  629. get the SYStem DEVice from init module - this is identical in function
  630.     to the G-Windows function sysdev() but since some poeple don't
  631.     have wmlib.l we'll just write one
  632. *********************************************************************/
  633. char *SysDev()
  634. {
  635. char *rtn,*modname = "init";
  636. u_int16 
  637.     type_lang = 0,
  638.     attr_rev = 0;
  639. mod_config 
  640.     *mod;               /* it is a config module */
  641.  
  642. mh_com *mod_head;       /* points to start of module */
  643. void *mod_exec;
  644.  
  645. if(_os_link(&modname,&mod_head,&mod_exec,&type_lang,&attr_rev) != 0)
  646.     rtn = "/dd";
  647. else
  648.     {
  649.     mod = (mod_config*)mod_head;
  650.     rtn = (char*)mod_exec + mod->_msysdrive;
  651.     }
  652. _os_unlink(mod_head);
  653. return rtn;
  654. }
  655.  
  656. /*********************************************************************
  657. SET the program PRIORITY - to make this work under G-windows, we have
  658.     to push the priority to match wfm
  659. *********************************************************************/
  660. SetPriority()
  661. {
  662. #ifdef GWINDOWS
  663.     process_id pid;
  664.     u_int16 
  665.         oldpriority,
  666.         age,
  667.         group,
  668.         user;
  669.     int32 schedule;
  670.     CRT_DEFINITION crtdef;
  671.     char devnam[32];
  672.  
  673. /* first verify we are in the Gwindows environment */
  674.  
  675. if(Window_Get(2,0,
  676.     W_CRT_Definition,crtdef,sizeof(CRT_DEFINITION),
  677.     0) != -1)
  678.     {   
  679. #   ifdef _MPF386
  680.         _os_id(&pid,&oldpriority,&age,&schedule,&group,&user);
  681. #   endif
  682. #   ifdef _MPF68K
  683.         _os9_id(&pid,&oldpriority,&group,&user);
  684. #   endif
  685.  
  686.     _os_setpr(pid,WFM_PRIORITY);
  687.     }
  688. #endif
  689. }
  690.  
  691. /*********************************************************************
  692. PARSE the PARaMeterS - returns -1 on error
  693. *********************************************************************/
  694. ParseParms(argc,argv)
  695. int argc;
  696. char *argv[];
  697. {
  698. char *p;
  699.  
  700. while(--argc > 0)
  701.     {
  702.     p=argv[argc];
  703.     if (*p == '-' )         /* if a parameter */
  704.         {
  705.         p++;
  706.         while(*p)           /* until end of string */
  707.             {
  708.             switch(*p)
  709.                 {
  710.                 case 'l':           /* force terminal port */ 
  711.                 case 'L':
  712.                     p++;
  713.                     if(*p == '=')   /* if an equal sign */
  714.                         p++;
  715.                     mport=p;
  716.                     p+=strlen(p)-1; /* point to NULL */
  717.                     break;
  718.                 case '?':
  719.                 case 'h':
  720.                 case 'H':
  721.                     usage();
  722.                     return -1;
  723.                 default:
  724.                     fprintf(stderr,"Unknown Parameter: %c\n",*p);
  725.                     return -1;
  726.                 }
  727.             p++;
  728.             }
  729.         }
  730.     else
  731.         {
  732.         fprintf(stderr,"Unknown Parameter: %c\n",*p);
  733.         return -1;
  734.         }
  735.     }
  736. return 0;
  737. }
  738.  
  739.