home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / EXECDOS / EXECDOS.C next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  6.3 KB  |  272 lines

  1. /* EXECDOS.C */
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. /* Execute DOS external BBS programs from OS/2 BBS */
  6.  
  7. #include "sbbs.h"
  8.  
  9. extern unsigned _heaplen=2048;
  10.  
  11. extern uint riobp;
  12.  
  13. ulong user_misc;
  14.  
  15. /****************************************************************************/
  16. /* Truncates white-space chars off end of 'str' and terminates at first tab */
  17. /****************************************************************************/
  18. void truncsp(char *str)
  19. {
  20.     uint c;
  21.  
  22. str[strcspn(str,"\t")]=0;
  23. c=strlen(str);
  24. while(c && (uchar)str[c-1]<=SP) c--;
  25. str[c]=0;
  26. }
  27.  
  28. void interrupt (*oldfunc)(void);
  29.  
  30. /*****************************************************************************/
  31. /* Interrupt routine to expand WWIV Ctrl-C# codes into ANSI escape sequences */
  32. /*****************************************************************************/
  33. void interrupt wwiv_expand()
  34. {
  35.     char str[256],al;
  36.     static int ctrl_c;
  37.     int i,j;
  38.  
  39. al=_AL;
  40. if(al!=3 && !ctrl_c)
  41.     oldfunc();
  42. else if(al!=3 && ctrl_c) {
  43.     ctrl_c=0;
  44.     if(user_misc&ANSI) {
  45.         switch(al) {
  46.             default:
  47.                 strcpy(str,"\x1b[0m");          /* low grey */
  48.                 break;
  49.             case '1':
  50.                 strcpy(str,"\x1b[0;1;36m");     /* high cyan */
  51.                 break;
  52.             case '2':
  53.                 strcpy(str,"\x1b[0;1;33m");     /* high yellow */
  54.                 break;
  55.             case '3':
  56.                 strcpy(str,"\x1b[0;35m");       /* low magenta */
  57.                 break;
  58.             case '4':
  59.                 strcpy(str,"\x1b[0;1;44m");     /* white on blue */
  60.                 break;
  61.             case '5':
  62.                 strcpy(str,"\x1b[0;32m");       /* low green */
  63.                 break;
  64.             case '6':
  65.                 strcpy(str,"\x1b[0;1;5;31m");   /* high blinking red */
  66.                 break;
  67.             case '7':
  68.                 strcpy(str,"\x1b[0;1;34m");     /* high blue */
  69.                 break;
  70.             case '8':
  71.                 strcpy(str,"\x1b[0;34m");       /* low blue */
  72.                 break;
  73.             case '9':
  74.                 strcpy(str,"\x1b[0;36m");       /* low cyan */
  75.                 break; }
  76.         j=strlen(str);
  77.         for(i=0;i<j;i++) {
  78.             _AL=str[i];
  79.             oldfunc(); } } }
  80. else
  81.     ctrl_c=1;
  82. }
  83.  
  84. int main(int argc, char **argv)
  85. {
  86.     char str[256],commandline[128],sbbsnode[81],sbbsnnum[81],msr[31]="0"
  87.         ,user_name[LEN_NAME+1]
  88.         ,user_alias[LEN_ALIAS+1]
  89.         ,user_phone[LEN_PHONE+1]
  90.         ,user_location[LEN_LOCATION+1]
  91.         ,user_age
  92.         ,user_sex
  93.         ,user_level
  94.         ,node_scrnlen
  95.         ,*envvar[30],*arg[30],c,d;
  96.     int i,file,base,com_base=0,com_irq,dte_rate,rmode,mode,node_num,col,row;
  97.     FILE *stream;
  98.  
  99. if(argc<2) {
  100.     printf("This program is for the internal use of Synchronet.\r\n");
  101.     return(-1); }
  102.  
  103. sprintf(sbbsnode,"SBBSNODE=%s",argv[1]);
  104. putenv(sbbsnode);
  105. sprintf(str,"%sEXECDOS.DAT",argv[1]);
  106. if((file=open(str,O_RDONLY|O_BINARY))!=-1) {
  107.     stream=fdopen(file,"rb");
  108.     str[0]=0;
  109.     fgets(str,128,stream);
  110.     truncsp(str);
  111.     if(strcmp(str,"V1.00")) {
  112.         printf("\7EXECDOS: SBBS VERSION MISMATCH!\7\r\n");
  113.         delay(5000);
  114.         return(-1); }
  115.     str[0]=0;
  116.     fgets(str,128,stream);
  117.     com_base=strtoul(str,0,16);
  118.     str[0]=0;
  119.     fgets(str,128,stream);
  120.     com_irq=atoi(str);
  121.     str[0]=0;
  122.     fgets(str,128,stream);
  123.     dte_rate=atoi(str);
  124.     str[0]=0;
  125.     fgets(str,128,stream);
  126.     rmode=strtoul(str,0,16);
  127.     str[0]=0;
  128.     fgets(str,128,stream);
  129.     mode=strtoul(str,0,16);
  130.     str[0]=0;
  131.     fgets(str,128,stream);
  132.     user_misc=strtoul(str,0,16);
  133.     str[0]=0;
  134.     fgets(str,128,stream);
  135.     node_num=atoi(str);
  136.     if(node_num) {
  137.         sprintf(sbbsnnum,"SBBSNNUM=%u",node_num);
  138.         putenv(sbbsnnum); }
  139.     fgets(commandline,128,stream);
  140.     truncsp(commandline);
  141.     str[0]=0;
  142.     fgets(str,128,stream);
  143.     i=atoi(str);    /* total env vars */
  144.     while(i--) {
  145.         str[0]=0;
  146.         fgets(str,128,stream);
  147.         truncsp(str);
  148.         if((envvar[i]=MALLOC(strlen(str)+1))!=NULL) {
  149.             strcpy(envvar[i],str);
  150.             putenv(envvar[i]); } }
  151.     str[0]=0;
  152.     fgets(str,128,stream);
  153.     truncsp(str);
  154.     sprintf(user_alias,"%.*s",LEN_ALIAS,str);
  155.     str[0]=0;
  156.     fgets(str,128,stream);
  157.     truncsp(str);
  158.     sprintf(user_name,"%.*s",LEN_NAME,str);
  159.     str[0]=0;
  160.     fgets(str,128,stream);
  161.     user_level=atoi(str);
  162.     str[0]=0;
  163.     fgets(str,128,stream);
  164.     user_age=atoi(str);
  165.     str[0]=0;
  166.     fgets(str,128,stream);
  167.     user_sex=str[0];
  168.     str[0]=0;
  169.     fgets(str,128,stream);
  170.     truncsp(str);
  171.     sprintf(user_phone,"%.*s",LEN_PHONE,str);
  172.     str[0]=0;
  173.     fgets(str,128,stream);
  174.     truncsp(str);
  175.     sprintf(user_location,"%.*s",LEN_LOCATION,str);
  176.     fclose(stream); }
  177.  
  178. printf("\nEXECDOS: %s\n",commandline);
  179.  
  180. if(rmode && com_base) {     /* Capture the port and intercept I/O */
  181.     base=0xffff;
  182.     switch(com_base) {
  183.         case 0xb:
  184.             rioctl(I14PC);
  185.             break;
  186.         case 0xffff:
  187.         case 0xd:
  188.             rioctl(I14DB);
  189.             break;
  190.         case 0xe:
  191.             rioctl(I14PS);
  192.             break;
  193.         case 0xf:
  194.             rioctl(I14FO);
  195.             break;
  196.         default:
  197.             base=com_base;
  198.             break; }
  199.  
  200.     if(rioini(base,com_irq)) {
  201.         printf("\7EXECDOS: Error initializing COM port (%x,%d)\7\r\n"
  202.             ,base,com_irq);
  203.         return(-1); }
  204.     rioctl(IOSM|CTSCK|RTSCK|PAUSE|ABORT);
  205.     rioctl(CPTON);    /* Cvt ^p to ^^ */
  206.  
  207.     sprintf(msr,"%lu",&riobp-1);
  208.  
  209.     sprintf(str,"%sINTRSBBS.DAT",argv[1]);
  210.     if((stream=fopen(str,"wb"))!=NULL) {
  211.         fprintf(stream,"%lu\r\n",&riobp-1);
  212.         fclose(stream); } }
  213.  
  214. setbaud(dte_rate);
  215.  
  216. if(rmode) {
  217.     ivhctl(rmode);
  218.  
  219.     if(mode&EX_WWIV) {    /* WWIV code expansion */
  220.         rioctl(CPTOFF); /* turn off ctrl-p translation */
  221.         oldfunc=getvect(0x29);
  222.         setvect(0x29,wwiv_expand); } }
  223.  
  224.  
  225. if(rmode&INT29L && user_alias[0]) {
  226.     node_scrnlen=lclini(0xd<<8);      /* Tab expansion, no CRLF expansion */
  227.     lclini(node_scrnlen-1);
  228.     col=lclwx();
  229.     row=lclwy();
  230.     lclxy(1,node_scrnlen);
  231.     lclatr(CYAN|HIGH|(BLUE<<4));
  232.     lputs("  ");
  233.     sprintf(str,"%-25.25s %02d %-25.25s  %02d %c %s"
  234.         ,user_alias,user_level,user_name[0] ? user_name : user_location
  235.         ,user_age
  236.         ,user_sex ? user_sex : SP
  237.         ,user_phone);
  238.     lputs(str);
  239.     lputc(CLREOL);
  240.     lclatr(LIGHTGRAY);
  241.     lclxy(col,row); }
  242.  
  243. /* separate args */
  244.  
  245. arg[0]=commandline; /* point to the beginning of the string */
  246. for(c=0,d=1;commandline[c];c++)   /* Break up command line */
  247.     if(commandline[c]==SP) {
  248.         commandline[c]=0;        /* insert nulls */
  249.         if(!strncmp(commandline+c+1,"%& ",3))
  250.             arg[d++]=msr;
  251.         else                    /* point to the beginning of the next arg */
  252.             arg[d++]=commandline+c+1; } 
  253. arg[d]=0;
  254.  
  255. /* spawn it */
  256.  
  257. i=spawnvp(P_WAIT,arg[0],arg);
  258.  
  259. if(rmode) {
  260.     rioctl(TXSYNC|(3<<8));
  261.     rioctl(IOFB);
  262.     if(mode&EX_WWIV)
  263.         setvect(0x29,oldfunc);
  264.     ivhctl(0);            /* replace DOS output interrupt vectors */
  265.     if(com_base)
  266.         rioini(0,0); }    /* replace com port */
  267.  
  268. //if(i)             // debug
  269. //      getch();
  270. return(i);
  271. }
  272.