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

  1. #include        <stdio.h>
  2. #include        <time.h>
  3. #include        <ctype.h>
  4. #include        <process.h>
  5. #include        <ext.h>
  6. #include     <tos.h>
  7. #include        <string.h>
  8. #include        <stdlib.h>
  9. /*#include        <errno.h>*/
  10. #include     <mintbind.h>
  11. #include     <atarierr.h>
  12.  
  13. #include        "portab.h"
  14. #include        "defs.h"
  15. #include        "ioslib.h"
  16. #include        "modules.h"
  17. #include        "routing.h"
  18.  
  19. #include        "inmail.h"
  20. #include        "strutil.h"
  21. #include        "crc.h"
  22. #include        "lang.h"
  23.  
  24. #include        "vars.h"
  25.  
  26. /*
  27. **    Scanning the inbound for files. If found jump to arcmail() to
  28. **    find out if this is arcmail. I arcmail returns ARCMAIL otherwise
  29. **    return EMPTY inbound.
  30. */
  31.  
  32. BYTE unpack_pkt(VOID)
  33. {
  34.     BYTE            buffer[128];
  35. #if defined LATTICE
  36.     DMABUFFER        blk;
  37. #else
  38.     struct ffblk    blk;
  39. #endif
  40.     
  41.     sprintf(buffer, "%s*.*", inbound);
  42.     
  43.     if (!findfirst(buffer, &blk, 0))
  44.     {
  45.         bundlesize = blk.ff_fsize;
  46.         if (arc_mail(blk.ff_name)) return(ARCMAIL);
  47.         
  48.         while (!findnext(&blk))
  49.         {
  50.             bundlesize = blk.ff_fsize;
  51.             if (arc_mail(blk.ff_name)) return (ARCMAIL);
  52.         }
  53.     }
  54.     
  55.     return(EMPTY);
  56. }
  57.  
  58. /*
  59. **    Searching for arcmail extensions. If found jump to unpack() and
  60. **    extract the packet. If no arcmail return EMPTY otherwise return
  61. **    RCMAIL.
  62. */
  63.  
  64. BYTE arc_mail(BYTE *name)
  65. {
  66.     BYTE    buffer[128],
  67.             *p;
  68.     WORD    i;
  69.     
  70.     if ((p = strchr(name, '.')) != NULL)
  71.     {
  72.         p++;
  73.         
  74.         for (i=0; isuf[i] != NULL; i++)
  75.             if (!strnicmp(p, isuf[i], 2))
  76.             {
  77.                 if (!isdigit(p[strlen(p)-1])) continue;
  78.                 
  79.                 sprintf(buffer, "%s%s", inbound, name);
  80.                 
  81.                 if (unpack(buffer)) return (ARCMAIL);
  82.                 else return (EMPTY);
  83.             }
  84.     }
  85.     
  86.     return (EMPTY);
  87. }
  88.  
  89. VOID isPKT (BYTE *name) {
  90.     BYTE buffer[128];
  91.     FILE *fp;
  92.     
  93.     sprintf(buffer, "%s%s",pkt_temp, name);
  94.     
  95.     if ((fp = fopen(buffer, "r+b")) != NULL) {
  96.         fread (&phdr, sizeof (struct _pkthdr), 1, fp);
  97.         giveTIMEslice();
  98.         fclose (fp);
  99.         if (intel (phdr.ph_ver) != 2) {
  100.             unlink (buffer);
  101.             log_line (6, Logmessage[M__NO_MESSAGE_PACKET],buffer);
  102.             return;
  103.         }
  104.     } else unlink (buffer);
  105.     
  106.     if(strstr(name, ".BKT") == NULL)
  107.         log_line(3, Logmessage[M__IS_MESSAGE_PACKET], buffer);
  108. }
  109.     
  110. /*
  111. **    Upack mail packets. Return EMPTY if error.
  112. */
  113.  
  114. BYTE unpack(BYTE *name)
  115. {
  116.     BYTE    arccmd[128],
  117.             arcprogram[128],
  118.             buffer[128];
  119.     WORD    j, type;
  120.  
  121.     LONG    sema_access;
  122.     
  123.     struct ffblk blk;
  124.     
  125.     type = ARCtype(name);
  126.     
  127.     log_line(3,Logmessage[M__RECEIVED], ArcMail[type], strupr(name));
  128.     log_line(3,Logmessage[M__SIZE_OF], bundlesize);
  129.     
  130.     switch (type)
  131.     {
  132.         case isUNKNOWN:
  133.             
  134.             take_default:
  135.             
  136.             if (strlen(Archcmdi))
  137.                 sprintf(arccmd, "%s %s %s*.*", Archcmdi, name, pkt_temp);
  138.             else
  139.                 sprintf(arccmd, "x %s %s*.*", name, pkt_temp);
  140.             
  141.             strcpy(arcprogram, Arch);
  142.             
  143.             break;
  144.             
  145.         case isARCmail:
  146.         
  147.             if (strlen(Arc))
  148.             {
  149.                 if (strlen(ArceC))
  150.                     sprintf(arccmd, "%s %s %s*.*", ArceC, name, pkt_temp);
  151.                 else
  152.                     sprintf(arccmd, "x %s %s*.*", name, pkt_temp);
  153.                 
  154.                 strcpy(arcprogram, Arc);
  155.             }
  156.             else goto take_default;
  157.             
  158.             break;
  159.             
  160.         case isLZHmail:
  161.         
  162.             if (strlen(Lzh))
  163.             {
  164.                 if (strlen(LzheC))
  165.                     sprintf(arccmd, "%s %s %s *.*", LzheC, name, pkt_temp);
  166.                 else
  167.                     sprintf(arccmd, "x %s %s*.*", name, pkt_temp);
  168.                 
  169.                 strcpy(arcprogram, Lzh);
  170.             }
  171.             else goto take_default;
  172.             
  173.             break;
  174.             
  175.         case isZIPmail:
  176.         
  177.             if (strlen(Zip))
  178.             {
  179.                 if (strlen(ZipeC))
  180.                     sprintf(arccmd, "%s %s %s *.*", ZipeC, name, pkt_temp);
  181.                 else
  182.                     sprintf(arccmd, "-x %s %s *.*", name, pkt_temp);
  183.                 
  184.                 strcpy(arcprogram, Zip);
  185.             }
  186.             else goto take_default;
  187.             
  188.             break;
  189.             
  190.         case isARJmail:
  191.         
  192.             if (strlen(Arj))
  193.             {
  194.                 if (strlen(ArjeC))
  195.                     sprintf(arccmd, "%s %s %s *.*", ArjeC, name, pkt_temp);
  196.                 else
  197.                     sprintf(arccmd, "x %s %s *.*", name, pkt_temp);
  198.                 
  199.                 strcpy(arcprogram, Arj);
  200.             }
  201.             else goto take_default;
  202.             
  203.             break;
  204.             
  205.         default:
  206.         
  207.             log_line(6,Logmessage[M__TAKE_DEFAULT]);
  208.             goto take_default;
  209.     }
  210.     
  211.     log_line(5,Logmessage[M__EXECUTE_PRG], arcprogram);
  212.     
  213.     printf ("\033E");
  214.     
  215.     if (MTask == MULTITOS) {
  216.         while (1) {
  217.             sema_access = Psemaphore (0, 0x494f535550L, 0L);
  218.             if (sema_access == EACCDN)
  219.                 delay (1000);            
  220.             else
  221.                 break;
  222.         }
  223.     }
  224.     
  225.     if (exec(arcprogram, arccmd, envp, &j) == -1)
  226.     {
  227.         log_line(6,Logmessage[M__CANT_EXEC_PRG], arcprogram);
  228.  
  229.         if (MTask == MULTITOS) {
  230.             sema_access = Psemaphore (1, 0x494f535550L, 0L);
  231.         }
  232.  
  233.         return(EMPTY);
  234.     }
  235.  
  236.     if (MTask == MULTITOS) {
  237.         sema_access = Psemaphore (1, 0x494f535550L, 0L);
  238.     }
  239.  
  240.     printf("\033E");
  241.     hprintf (S_ALL, "");
  242.     
  243. #if defined EXTERNDEBUG
  244.     if (debugflag) {
  245.         log_line(6, "#Memory after archiver %ld", coreleft());
  246.     }
  247. #endif
  248.     
  249.     if (!j)
  250.     {
  251.         if (keepmsg) rename_arcmail(name);
  252.         else {
  253.         
  254.         /*
  255.         **    If archiver returns 0, and the packet is still
  256.         **    unpacked, don't delete the packet.
  257.         */
  258.         
  259.             sprintf (arcprogram, "%s*.PKT",pkt_temp);
  260.             if (!findfirst(arcprogram, &blk, 0))
  261.                 unlink(name);
  262.             else {
  263.                 
  264.                 /*
  265.                 **    Unpacket but not an PKT file. Delete them.
  266.                 */
  267.                 
  268.                 sprintf(buffer, "%s*.*", pkt_temp);
  269.                 if (!findfirst(buffer, &blk, 0)) {
  270.                     isPKT (blk.ff_name);
  271.                     while (!findnext (&blk)) {
  272.                         isPKT (blk.ff_name);
  273.                     }
  274.                     return (EMPTY);
  275.                 } else {
  276.                 
  277.                     log_line(6, Logmessage[M__NOT_UNPACKED]);
  278.                     return (EMPTY);
  279.                 }
  280.             }
  281.         }
  282.         return (ARCMAIL);
  283.     }
  284.     else
  285.     {
  286.         log_line(5,Logmessage[M__RETURNS_ERRORCODE], j, ", RENAME");
  287.         rename_arcmail(name);
  288.         
  289.         /*
  290.         **    If the archiver returns an errorcode, but there are packets
  291.         **    in the inbound, return there is nothing happened.
  292.         */
  293.         
  294.         sprintf(arccmd, "%s*.PKT", pkt_temp);
  295.         if (!findfirst(arccmd, &blok, 0)) return(ARCMAIL);
  296.         
  297.         return (EMPTY);
  298.     }
  299. }
  300.  
  301. BYTE rename_arcmail(BYTE *name)
  302. {
  303.     BYTE    newname[129],
  304.             *p;
  305.     
  306.     strcpy(newname, name);
  307.     
  308.     if ((p = strrchr(newname, '.')) != NULL)
  309.     {
  310.         strcpy(++p, "000");
  311.         
  312.         while (rename(name, newname))
  313.         {
  314.             *p += 1;
  315.             
  316.             if (*p == 'z')
  317.             {
  318.                 p++;
  319.                 
  320.                 if (!*p)
  321.                 {
  322.                     log_line(4,Logmessage[M__CANT_RENAME],name);
  323.                     return(FALSE);
  324.                 }
  325.             }
  326.         }
  327.     }
  328.     return(TRUE);
  329. }
  330.