home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / ios_src / iosmail.c < prev    next >
C/C++ Source or Header  |  1993-01-31  |  15KB  |  632 lines

  1. /*
  2.     This source of IOSmail is free. This is indeed the source of iosmail.
  3.     Compile it, and try out. The original author don't take any reponsability
  4.     if something go wrong.
  5. */
  6.  
  7. #include        <stdio.h>
  8. #include        <stdlib.h>
  9. #include        <ext.h>
  10. #include        <string.h>
  11. #include        <ctype.h>
  12. #include        <process.h>
  13. #include        <tos.h>
  14. #include        <vdi.h>
  15. #include        <time.h>
  16.  
  17. /*
  18.     For 2 underneath .H file you need the original package of multitos.
  19. */
  20.  
  21. #include     <mintbind.h>
  22. #include     <filesys.h>
  23.  
  24. #include        "portab.h"
  25.  
  26. #include        "defs.h"
  27. #include        "ioslib.h"
  28. #include        "modules.h"
  29. #include        "wareas.h"
  30. #include        "strutil.h"
  31. #include        "crc.h"
  32. #include        "lang.h"
  33.  
  34. #include        "vars.h"
  35.  
  36.  
  37. MLOCAL CONST BYTE    *Importing[] = {"protected inbound",
  38.                                     "known inbound",
  39.                                     "normal inbound"};
  40.  
  41. ULONG timeTESTresult;
  42.  
  43. BYTE *Copyright = "      [I]nMail [O]utMail [S]canMail. Copyright Rinaldo Visscher 1990 - 1992.";
  44.  
  45. /*
  46. **    Show the results.
  47. */
  48.  
  49. MLOCAL VOID show_results(VOID)
  50. {
  51.     WORD    i, m;
  52.     BYTE    buffer[128],
  53.             *p, *q,
  54.             temp[128];
  55.     
  56.     log_line(2,"%+-------+---------------------+-------+------+");
  57.     log_line(2,"%| Msgs  | Area                | SysOp | Email|");
  58.     log_line(2,"%+-------+---------------------+-------+------+");
  59.     
  60.     for(i=0; i < msgareas; i++)
  61.         if (Areamsgs[i])
  62.             log_line(2,"%| %-4d  | %-20s| %-4d  | %-4d |",
  63.                 Areamsgs[i], Areaname[i], Tosysop[i], Ncreated[i]);
  64.     
  65.     log_line(2,"%+-------+---------------------+-------+------+");
  66.     
  67.     if (nnetmails)
  68.         log_line(2,"%| %-4d  | %-20s| %-4d  | 0    |", nnetmails, "MAIL", nnet_priv);
  69.     
  70.     if (nprivate)
  71.         log_line(2,"%| %-4d  | %-20s| %-4d  | 0    |", nprivate, "PRIVATEMAILBOX", nprivate);
  72.     
  73.     if (nnetmails || nprivate)
  74.         log_line(2,"%+-------+---------------------+-------+------+");
  75.     
  76.     if (doreport)
  77.     {
  78.         log_line(1,Logmessage[M__DAILY_RAPPORT]);
  79.         
  80.         time(&secs);
  81.         tijd = localtime(&secs);
  82.         strftime(tm_now,29,"%d %b %H:%M:%S",tijd);
  83.         
  84.         if ((FDUMMY = fopen(HISTORYFILE, "r")) == NULL)
  85.         {
  86.             if ((OUT = fopen(HISTORYFILE, "w")) == NULL)
  87.             {
  88.                 log_line(6,Logmessage[M__RAPPORT_NOT_OPEN]);
  89.                 return;
  90.             }
  91.             
  92.             fprintf(OUT, "Started : %s\nUpdated : %s\n", tm_now, tm_now);
  93.             
  94.             for (i=0; i < msgareas; i++)
  95.                 fprintf(OUT,"%-20s %d\n",Areaname[i],Areamsgs[i]);
  96.             
  97.             fclose(OUT);
  98.             return;
  99.         }
  100.         
  101.         if ((OUT = fopen(HISTORYDUP, "w")) == NULL)
  102.         {
  103.             log_line(6,Logmessage[M__RAPPORT_NOT_OPEN]);
  104.             fclose(FDUMMY);
  105.             return;
  106.         }
  107.         
  108.         fgets(buffer, 128, FDUMMY);
  109.         fprintf(OUT, "%sUpdated : %s\n", buffer, tm_now);
  110.         fgets(buffer, 128, FDUMMY);
  111.         
  112.         while ((fgets(buffer, 128, FDUMMY)))
  113.         {
  114.             p = skip_blanks(buffer);
  115.             
  116.             if (*p == ';') continue;
  117.             if ((i = (WORD)strlen(p)) < 3) continue;
  118.             
  119.             q = &p[--i];
  120.             
  121.             if (*q == '\r' || *q == '\n') *q = EOS;
  122.             if ((q = strchr(p, ';')) != NULL) *q = EOS;
  123.             
  124.             for (q = temp; *p && !isspace(*p); *q++ = *p++);
  125.             *q = EOS;
  126.             
  127.             for (i=0; i < msgareas; i++)
  128.                 if (!strnicmp(temp, Areaname[i], 20))
  129.                 {
  130.                     p = skip_blanks(p);
  131.                     m = atoi(p);
  132.                     m += Areamsgs[i];
  133.                     break;
  134.                 }
  135.             
  136.             if (i < msgareas) fprintf(OUT, "%-20s %d\n", temp, m);
  137.         }
  138.         
  139.         fclose(OUT);
  140.         fclose(FDUMMY);
  141.         unlink(HISTORYFILE);
  142.         rename(HISTORYDUP, HISTORYFILE);
  143.     }
  144. }
  145.  
  146. MLOCAL VOID give_help(VOID)
  147. {
  148.     WORD i = 0;
  149.     BYTE buffer[128],keyhit[128],
  150.          *p;
  151.     
  152.     if ((FDUMMY = fopen("IOSMAIL.HLP","r")) == NULL) {
  153.         log_line(-1,Logmessage[M__NO_HELP_FILE]);
  154.         return;
  155.     }
  156.     
  157.     while (fgets(keyhit, 128, FDUMMY)) {
  158.         p = skip_blanks(keyhit);
  159.         if (*p == ';') continue;
  160.         break;
  161.     }
  162.     
  163.     while(fgets(buffer, 128, FDUMMY)) {
  164.         p = skip_blanks(buffer);
  165.         if (*p == ';') continue;
  166.         fprintf(stderr, buffer);
  167.         i ++;
  168.         if ( i == 23) {
  169.             i = 0;
  170.             fprintf(stderr, keyhit);
  171.             while (!kbhit());
  172.             getch();
  173.             fprintf(stderr,"\033E");
  174.         }
  175.     }
  176.  
  177.     fprintf(stderr, keyhit);
  178.     while (!kbhit());
  179.     getch();
  180.     fprintf(stderr, "\033E");
  181.     
  182.     fprintf(stderr, "This program and the C source code is registrated copyright of\n");
  183.     fprintf(stderr, "(c) QandA software Holland. The changing any byte in this program or\n");
  184.     fprintf(stderr, "changing the source code of this program is an violation against the\n");
  185.     fprintf(stderr, "law in the country where it is commited, and can be seen as criminal act.\n\n");
  186.     fprintf(stderr, "This program is written by Rinaldo Visscher, Holland.\n\n");
  187.     fprintf(stderr, "Many thanks to Udo Erdelhoff,\n");
  188.     fprintf(stderr, "               Joerg Spilker,\n");
  189.     fprintf(stderr, "           and Daniel Roessen\n\n");
  190.     fprintf(stderr, "Read the license agreement as is stated in the document.\n\n");
  191.     
  192. /*    
  193.     fprintf(stderr, "Many thanks to\n\n");
  194.     fprintf(stderr, "Johan Ansems .......... 2:280/301    .... Support Benelux\n");
  195.     fprintf(stderr, "Bernd Renzing ......... 2:245/52     .... Support Germany\n");
  196.     fprintf(stderr, "Steven Green .......... 2:252/25     .... Support UK\n");
  197.     fprintf(stderr, "Rolf Thieme ........... 2:243/95     .... Manual\n");
  198.     fprintf(stderr, "Eddie Tao ............. 2:280/3.9    .... Manual\n");
  199.     fprintf(stderr, "Fred Schuit ........... 2:280/3.10   .... Manual\n");
  200.     fprintf(stderr, "Vincent Pomey ......... 2:320/100\n");
  201.     fprintf(stderr, "Alexander Bochmann .... 2:247/12\n");
  202.     fprintf(stderr, "Daron Breewood ........ 2:252/123\n");
  203.     fprintf(stderr, "Peter Habing .......... 2:280/3.15\n");
  204.     fprintf(stderr, "Rene Drenth ........... 2:280/3.4\n\n");
  205.     fprintf(stderr, "THIS IS AN BETATESTER VERSION ONLY Version 0.81\n\n");
  206. */    
  207.     fprintf(stderr, "Hee you, turn on some good music ......\n");
  208.     fprintf(stderr, "Like Pink Floyd, Yngwie Malmsteen, Steve Vai, Joe Satriani,\n");
  209.     fprintf(stderr, "Rush, Mindstorm, Asia, Jason Becker, Marty Friedman, Anthrax,\n");
  210.     fprintf(stderr, "Patrick Rondat, Dweezil Zappa and many more :-)\n\n");
  211.     
  212.     fprintf(stderr, keyhit);
  213.     
  214.     while (!kbhit());
  215.     getch();
  216. }
  217.  
  218. WORD read_keyfile(BYTE phase)
  219. {
  220. /*
  221.     IOSKEY            key;
  222.     WORD            fhandle;
  223.     struct ffblk    fi;
  224.     UBYTE            retcode;
  225. */    
  226.     /*
  227.     **    REMEMBER TO UPDATE PACKET HEADER VERSION INFO !!!!!!!
  228.     */
  229.     
  230.     strcpy(IOSmail, V_IOSMAIL);
  231.     
  232.     strcpy(InMail, V_INMAIL);
  233.     strcpy(OutMail, V_OUTMAIL);
  234.     strcpy(ScanMail, V_SCANMAIL);
  235.     strcpy(Consultant, V_CONSULTANT);
  236.     return (1);
  237.     
  238. }
  239. /*
  240.     
  241.     if (findfirst(KEYFILE, &fi, 0x20))
  242.     {
  243.         if (!phase) exit (25);
  244.     }
  245.     
  246.     fhandle = Fopen(KEYFILE, FO_READ);
  247.     Fread(fhandle, sizeof(IOSKEY), &key);
  248.     Fclose(fhandle);
  249.     
  250.     decrypt(&key);
  251.     
  252.     if (key.type == ALPHALEVEL)
  253.     {
  254.         strcat(IOSmail, "U");
  255.         strcat(InMail, "U");
  256.         strcat(OutMail, "U");
  257.         strcat(ScanMail, "U");
  258.         retcode = UNR_VERS;
  259.     }
  260.     
  261.     if (phase) {
  262.         if ((key.type == BETALEVEL && !stricmp(SysOp, key.name)))
  263.         {
  264.             strcat(IOSmail, "X");
  265.             strcat(InMail, "X");
  266.             strcat(OutMail, "X");
  267.             strcat(ScanMail, "X");
  268.             retcode = BET_VERS;
  269.         }        
  270.         else if ((key.type == REGISTEREDLEVEL && !stricmp(SysOp, key.name)))
  271.         {
  272.             strcat(IOSmail, "R");
  273.             strcat(InMail, "R");
  274.             strcat(OutMail, "R");
  275.             strcat(ScanMail, "R");
  276.             retcode = REG_VERS;
  277.         } else if (key.type != ALPHALEVEL) {
  278.             terminate (10);
  279.         }
  280.     } else {
  281.         if (key.type == ALPHALEVEL) 
  282.             retcode = UNR_VERS;
  283.         else if (key.type == BETALEVEL)
  284.             retcode = BET_VERS;
  285.         else if (key.type == REGISTEREDLEVEL)
  286.             retcode = REG_VERS;
  287.         else
  288.             exit (25);
  289.     }
  290.     
  291.     sprintf (&IOSmail[strlen(IOSmail)], "%04x", key.reg_num);
  292.     sprintf (&InMail[strlen(InMail)], "%04x", key.reg_num);
  293.     sprintf (&OutMail[strlen(OutMail)], "%04x", key.reg_num);
  294.     sprintf (&ScanMail[strlen(ScanMail)], "%04x", key.reg_num);
  295.  
  296.     return(retcode);
  297. }
  298. */
  299.  
  300. VOID main(WORD argc, BYTE *argv[], BYTE *env)
  301. {
  302.     WORD        i;
  303.     BOOLEAN        foundlabel = FALSE,
  304.                 uncomp = FALSE,
  305.                 forcecompile = FALSE;
  306.     BYTE         cmdline[129],
  307.                  *p, *q,
  308.                 temp[128];
  309. /*
  310.     LONG        usp, *cookie;
  311.  
  312.     __MiNT = 0;
  313.  
  314.     usp = Super (0L);
  315.  
  316.     cookie = (LONG *) 0x5a0UL;
  317.         
  318.     while (*cookie) {
  319.         if (*cookie == 0x4d694e54L) { /* MiNT */
  320.             __MiNT = cookie[1];
  321.             MTask = MULTITOS;
  322.             break;
  323.         }
  324.         cookie += 2;
  325.     }
  326.     
  327.     Super ( (LONG *) usp );
  328. */
  329.     
  330.     i = Pgetpid();
  331.     
  332.     if (i == -32)
  333.         __MiNT = 0;
  334.     else {
  335.         __MiNT= 1;
  336.         MTask = MULTITOS;
  337.         Files_to_open = (UWORD) Sysconf (MAX_FILES_OPEN);
  338.     }
  339.     
  340.     Ttest = time(NULL);
  341.         
  342.     strcpy(envp, env);
  343.     
  344.     if (langload() == FALSE) exit (100);
  345.         
  346.     if (argc > 1)
  347.         strcpy(cmdline,argv[1]);
  348.         for(i=2; i < argc; i++) {
  349.             strcat(cmdline," ");
  350.             strcat(cmdline,argv[i]);
  351.         }
  352.         i = 0;
  353.         if (cmdline[i] == '-')
  354.         {
  355.             while(cmdline[i+1] != EOS) {
  356.                 i++;
  357.                 switch(toupper(cmdline[i]))
  358.                 {
  359.                     case ' ':     
  360.                     case '-':    i++; break;
  361.                     case 'A':    keepmsg = TRUE; break;
  362.                     case 'B':    toprivate = TRUE; break;
  363.                     case 'C':    dochanged = TRUE; break;
  364.                     case 'D':    docrunch = TRUE; break;
  365.                     case 'E':
  366.                     
  367.                         i++;
  368.                         
  369.                         if (cmdline[i] == '-')
  370.                         {
  371.                             log_line(4,Logmessage[M__LABEL_EXPECT]);
  372.                             i++;
  373.                             continue;
  374.                         }
  375.                         
  376.                         dolabel = TRUE;
  377.                         
  378.                         p = &cmdline[i];
  379.                         
  380.                         p = skip_blanks(p);
  381.                         
  382.                         for(q=temp; *p && !isspace(*p); *q++=*p++,i++);
  383.                         *q = EOS;
  384.                         
  385.                         configlabel = ctl_string(temp);
  386.                         
  387.                         if (!stricmp(configlabel, "endlabel"))
  388.                         {
  389.                             log_line(-1,Logmessage[M__ILL_LABEL]);
  390.                             free(configlabel);
  391.                             dolabel = FALSE;
  392.                         }
  393.                         i++;
  394.                         break;
  395.                     
  396.                     case 'F':    forcecompile = TRUE; break;
  397.                     case 'H':    give_help(); exit(SUCCESS); break;
  398.                     case 'I':    doimport = TRUE; break;
  399.                     case 'K':    doifna = TRUE; break;
  400.                     case 'L':    doled = TRUE; break;
  401.                     case 'M':    domsg = TRUE; break;
  402.                     case 'O':    dopack = TRUE; break;
  403.                     case 'P':    dopkt = TRUE; break;
  404.                     case 'Q':    doquit = TRUE; break;
  405.                     case 'R':    dosecure++; break;
  406.                     case 'S':    doscanmail = TRUE; break;
  407.                     case 'T':    dolog = TRUE; break;
  408.                     case 'U':    uncomp = TRUE; break;
  409.                     case 'V':    CRspec = TRUE; break;
  410.                     case 'W':    dowait = TRUE; break;
  411.                     case 'X':    domulti_reg = TRUE;    break;
  412.                     case 'Z':    dostripzone = TRUE;    break;
  413.                     
  414.                     default:    log_line(-1,Logmessage[M__SWITCH_MAIN], cmdline[i]);
  415.                                 break;
  416.                 }
  417.             } 
  418.         }
  419.  
  420.     StatusScreen = TRUE;
  421.  
  422.     Cursconf (0, 0);
  423.  
  424.     if (StatusScreen) {
  425.         hprintf (S_ALL, "");
  426.     }
  427.  
  428. /*    registered = read_keyfile(0); */
  429.                 
  430.     if (!init_cfg(&foundlabel)) exit(10);
  431.     
  432.     if (MTask == MULTIGEM && __MiNT != 0) {
  433.         MTask = MULTITOS;
  434.     }
  435.     
  436.     if (MTask == MULTITOS) {
  437.         log_line (2, "+MultiTos detected....");
  438.         Psetlimit (2, 0);
  439.     }
  440.     
  441.     registered = read_keyfile(1); 
  442.     
  443.     if(area_attrib() == TRUE || forcecompile == TRUE) {
  444.         if (!read_areas(AREAFILE, 0)) exit(10);
  445.         read_areas(DAREAFILE, 1);
  446.         write_bin_areas();
  447.     } else {
  448.         if(!read_bin_areas()) exit(10);
  449.     }
  450.     
  451.     if (uncomp == TRUE) uncompile();
  452.     
  453.     if (doled) read_lednew();
  454.     
  455.     /*
  456.     **    Moved for multitasking
  457.     */
  458.     
  459.     if (StatusScreen == FALSE) {
  460.         if (MTask != MULTIGEM) {
  461.             fprintf(stderr, "%s\n\n", Copyright);
  462.             fprintf(stderr, "         Read for copyrights the enclosed licence agreements !\n");
  463.             fprintf(stderr, "               FidoNet productcode information %d\n\n",IOSPRDCODE);
  464.     #if defined EXTERNDEBUG
  465.             fprintf(stderr, "IOSmail debug version. Debug & OutmailDebug in CFG\n");
  466.     #endif
  467.             for (i=0; i < 80; i++) {
  468.                 fprintf(stderr, "-");
  469.             }
  470.             fprintf(stderr, "\n");
  471.             LOG_line = 4;
  472.         } else {
  473.             v_curtext(vdi_handle, Copyright);
  474.             v_curtext(vdi_handle, "\n\n\r");
  475.             v_curtext(vdi_handle, "         Read for copyrights the enclosed licence agreements !\n\r");
  476.             for (i=0; i < 80; i++) {
  477.                 v_curtext(vdi_handle, "-");
  478.             }
  479.             v_curtext(vdi_handle, "\n\r");
  480.         }
  481.     }
  482.         
  483.     TOSversion = Sversion();
  484.  
  485. #if defined EXTERNDEBUG
  486.     if (debugflag) {
  487.         log_line(6, ">Free memory at start %ld", coreleft());
  488.         log_line(6, ">TOS version %x", TOSversion);
  489.     }
  490. #endif
  491.     
  492.     if (strlen(logfile))
  493.     {
  494.         if (log_open() == FAILURE)
  495.         {
  496.             log_line(-1,Logmessage[M__LOG_NOT_OPEN]);
  497.             exit(10);
  498.         }
  499.         else
  500.             if (foundlabel)
  501.                 log_start(IOSmail, configlabel);
  502.             else
  503.                 log_start(IOSmail, NULL);
  504.     }
  505.     else log_line(2,Logmessage[M__LOG_DIR]);
  506.     
  507.     if (dolabel) free(configlabel);
  508.     
  509.     inst_dupetrap();
  510.     
  511.     /*
  512.     **    If an error on reading an config file exit with
  513.     **    errorlevel 10
  514.     */
  515.     
  516.     if (doimport)
  517.     {
  518.         inbound = (BYTE *) myalloc(128);
  519.         
  520.         for (i=0; i < 3; i++)
  521.         {
  522.             if (Inboundpaths[i] == NULL)
  523.             {
  524.                 log_line(1,Logmessage[M__NO_INBOUND], Importing[i]);
  525.                 continue;
  526.             }
  527.             
  528.             if (!strlen(Inboundpaths[i])) continue;
  529.             we_have_inbound = (BYTE) i;
  530.             
  531.             strncpy(inbound, Inboundpaths[i], 127);
  532.  
  533.             log_line(1,Logmessage[M__DIR_SEARCH], inbound);
  534.             
  535.             import_pkt(inbound);
  536.             import_pkt(pkt_temp);
  537.             
  538.             while (unpack_pkt()) import_pkt(pkt_temp);
  539.         }
  540.         
  541.         if (nimported)
  542.         {
  543.             show_results();
  544.             log_line(3,Logmessage[M__MESSAGES_IMPORTED], nimported);
  545.             log_line(3,Logmessage[M__MESSAGES_CREATED], nechos);
  546.             log_line(3,Logmessage[M__MESSAGES_TRASHED], ntrashed);
  547.         }
  548.         
  549.         if (AreaAdded) {
  550.             uncompile();
  551.             strcpy (cmdline, Envpath);
  552.             strcpy (temp, Envpath);
  553.             strcat (cmdline, "AREAS.BBS");
  554.             strcat (temp, "AREAS.DUP");
  555.             
  556.             unlink (temp);
  557.             
  558.             rename (cmdline, temp);
  559.             strcpy (temp, Envpath);
  560.             strcat (temp, "AREAS.UNC");
  561.             rename (temp, cmdline);
  562.         }
  563.             
  564.         /*
  565.         **    Exit with errorlevel when mail is imported,
  566.         **    otherwise exit with 0
  567.         */
  568.         
  569.         if (!doscanmail && !dopack && !docrunch)
  570.         {
  571.             timeTESTresult = time(NULL);
  572.             
  573.             log_line(6, Logmessage[M__IMPORT_TIME], timeTESTresult - Ttest);
  574.             
  575.             if (doled) write_lednew();
  576.             
  577.             if (nimported) terminate(1);
  578.             terminate(0);
  579.         }
  580.     }
  581.     
  582.     if (doscanmail)
  583.     {
  584.         dofastimport = FALSE;
  585.         scan_areas();
  586.         log_line(2,Logmessage[M__MESSAGES_CREATED], nechos);
  587.     }
  588.     
  589.     if (dopack)
  590.     {
  591.         if (areafixmsgs)
  592.         {
  593.             log_close();
  594.             
  595.             if (strlen(Areafix))
  596.             {
  597.                 if (exec(Areafix, Areafixcmd, "", &i))
  598.                     log_line(6,Logmessage[M__AREAFIX_NORUN]);
  599.                 
  600.                 if (strlen(logfile))
  601.                 {
  602.                     if (log_open() == FAILURE)
  603.                         log_line(-1,Logmessage[M__LOG_NOT_OPEN]);
  604.                 }
  605.                 else
  606.                     log_line(3,Logmessage[M__LOG_DIR]);
  607.             }
  608.         }
  609.         
  610.         pack_mail();
  611.     }
  612.     
  613.     if (docrunch && !CRspec)
  614.         compactMSGbase(CRUNCHALL);
  615.     else if (CRspec && !docrunch)
  616.         compactMSGbase(CRUNCHSPECIALS);
  617.     else if(docrunch && CRspec)
  618.         compactMSGbase(CRUNCHSPECIALS);
  619.         
  620.     timeTESTresult = time(NULL);
  621.     
  622.     log_line(6, Logmessage[M__OVERAL_TIME], timeTESTresult - Ttest);
  623.     
  624.     if (nechos || nimported)
  625.     {
  626.         if (doled) write_lednew();
  627.         terminate(1);
  628.     }
  629.     
  630.     terminate(0);
  631. }
  632.