home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / lpopper.zip / packmail.c < prev    next >
C/C++ Source or Header  |  1999-07-12  |  7KB  |  269 lines

  1. #include "popper.h"
  2.  
  3. int PackBox(char * User, int DoDelete)
  4. { FILE *Tmp;
  5.   FILE *fBox;
  6.   FILE *rBox;
  7.   char TmpPath[512];
  8.   char mBoxPath[512];
  9.   char rBoxPath[512];
  10.   long i, Len;
  11.   int Res;
  12.  
  13.  
  14.   if(DoDelete==0)
  15.     { for(i=0;i<msgCount;i++)
  16.         mBox[i].Deleted=0;
  17.       uMsgCount=msgCount;
  18.       uTotalLen=TotalLen;
  19.     }
  20.   sprintf(TmpPath, "%s%s.tmp", BoxPath, User);
  21.   sprintf(mBoxPath, "%s%s.mb", BoxPath, User);
  22.   sprintf(rBoxPath, "%s%s", BoxPath, User);
  23.  
  24.   if(msgCount==0)
  25.     { unlink(mBoxPath);
  26.       return(0);
  27.     }
  28.  
  29.   Tmp =_fsopen(TmpPath, "wb", SH_DENYRW);
  30.   if(Tmp==NULL)
  31.     { perror("Can't create temporary mailbox");
  32.       return(-1);
  33.     }
  34.   fBox=_fsopen(mBoxPath, "rb", SH_DENYRW);
  35.   if(fBox==NULL)
  36.     { perror("Can't open mailbox");
  37.       fclose(Tmp);
  38.       return(-1);
  39.     }
  40.  
  41.   for(i=0;i<msgCount;i++)
  42.    { 
  43. /*     fprintf(stderr,
  44.              "Message %lu\n"
  45.              "From %lX to %lX\n"
  46.              "Header to %lX\n"
  47.              "Status from %lX to %lX\n"
  48.              "Status=%u, Old Status=%u\n",
  49.              i,
  50.              mBox[i].Begin, mBox[i].End,
  51.              mBox[i].hEnd,
  52.              mBox[i].sBeg, mBox[i].sEnd, mBox[i].Status, mBox[i].oStatus);*/
  53.  
  54.      if(mBox[i].Deleted) continue;
  55.  
  56. /*******************************************************************/
  57. /*******************************************************************/
  58. /*******************************************************************/
  59. /*******************************************************************/
  60.  
  61.  
  62.      if(mBox[i].oStatus==None)
  63.        { if(CopyBlock(fBox, Tmp, mBox[i].Begin, mBox[i].hEnd)!=0)
  64.            { perror("Mailbox -> TempBox copy failed");
  65.              fclose(Tmp);
  66.              unlink(TmpPath);
  67.              fclose(fBox);
  68.              return(-1);
  69.            }
  70.          switch(mBox[i].Status)
  71.           { case Unreaded : Res=AddBlock(Tmp, "Status: U\x0D\x0A");
  72.                             break;
  73.             case Readed   : Res=AddBlock(Tmp, "Status: R\x0D\x0A");
  74.                             break;
  75.             case Old      : Res=AddBlock(Tmp, "Status: O\x0D\x0A");
  76.                             break;
  77.             case ROld     : Res=AddBlock(Tmp, "Status: RO\x0D\x0A");
  78.                             break;
  79.             default       : Res=AddBlock(Tmp, "Status: U\x0D\x0A");
  80.                             break;
  81.           }
  82.          if(Res!=0)
  83.            { perror("Can't add \"Status:\"");
  84.              fclose(Tmp);
  85.              unlink(TmpPath);
  86.              fclose(fBox);
  87.              return(-1);
  88.            }
  89.  
  90. /*******************************************************************/
  91.          if(mBox[i].noID==1)
  92.            { Res=AddBlock(Tmp, "Message-ID: <");
  93.              Res+=AddBlock(Tmp, mBox[i].msgID);
  94.              Res+=AddBlock(Tmp, ">\x0D\x0A");
  95.            }
  96.          if(Res!=0)
  97.            { perror("Can't add \"Message-ID:\"");
  98.              fclose(Tmp);
  99.              unlink(TmpPath);
  100.              fclose(fBox);
  101.              return(-1);
  102.            }
  103. /*******************************************************************/
  104.  
  105.          if(CopyBlock(fBox, Tmp, mBox[i].hEnd, mBox[i].End+1)!=0)
  106.            { perror("Mailbox -> TempBox copy failed");
  107.              fclose(Tmp);
  108.              unlink(TmpPath);
  109.              fclose(fBox);
  110.              return(-1);
  111.            }
  112.        }
  113.       else
  114.        { if(CopyBlock(fBox, Tmp, mBox[i].Begin, mBox[i].sBeg)!=0)
  115.            { perror("Mailbox -> TempBox copy failed");
  116.              fclose(Tmp);
  117.              unlink(TmpPath);
  118.              fclose(fBox);
  119.              return(-1);
  120.            }
  121.          switch(mBox[i].Status)
  122.           { case Unreaded : Res=AddBlock(Tmp, "Status: U\x0D\x0A");
  123.                             break;
  124.             case Readed   : Res=AddBlock(Tmp, "Status: R\x0D\x0A");
  125.                             break;
  126.             case Old      : Res=AddBlock(Tmp, "Status: O\x0D\x0A");
  127.                             break;
  128.             case ROld     : Res=AddBlock(Tmp, "Status: RO\x0D\x0A");
  129.                             break;
  130.             default       : Res=AddBlock(Tmp, "Status: U\x0D\x0A");
  131.                             break;
  132.           }
  133.          if(Res!=0)
  134.            { perror("Can't add \"Status:\"");
  135.              fclose(Tmp);
  136.              unlink(TmpPath);
  137.              fclose(fBox);
  138.              return(-1);
  139.            }
  140. /*******************************************************************/
  141.          if(mBox[i].noID==1)
  142.            { Res=AddBlock(Tmp, "Message-ID: <");
  143.              Res+=AddBlock(Tmp, mBox[i].msgID);
  144.              Res+=AddBlock(Tmp, ">\x0D\x0A");
  145.            }
  146.          if(Res!=0)
  147.            { perror("Can't add \"Message-ID:\"");
  148.              fclose(Tmp);
  149.              unlink(TmpPath);
  150.              fclose(fBox);
  151.              return(-1);
  152.            }
  153. /*******************************************************************/
  154.          if(CopyBlock(fBox, Tmp, mBox[i].sEnd, mBox[i].End+1)!=0)
  155.            { perror("Mailbox -> TempBox copy failed");
  156.              fclose(Tmp);
  157.              unlink(TmpPath);
  158.              fclose(fBox);
  159.              return(-1);
  160.            }
  161.        }
  162. /************************************************/
  163.    }
  164. /*Packing done - mail from fBox (mBoxPath=user.mb) 
  165.   was copied to Tmp(TmpPath=user.tmp)*/
  166.  
  167.  
  168.   fclose(fBox);
  169.  
  170. /*Removing fBox (mBoxPath=user.mb)*/
  171.   fBox=_fsopen(mBoxPath, "wb", SH_DENYRW);
  172.   if(fBox==NULL)
  173.     { perror("Can't reopen mailbox");
  174.       fclose(Tmp);
  175.       unlink(TmpPath);
  176.       return(-1);
  177.     }
  178.  
  179.  
  180.  
  181.   fclose(Tmp);
  182.   Tmp=_fsopen(TmpPath, "r+b", SH_DENYRW);
  183.   if(Tmp==NULL)
  184.     { perror("Can't reopen temporary maildrop");
  185.       fclose(fBox);
  186.       return(-1);
  187.     }
  188.  
  189.  
  190. /*Copying tmp mailbox to mb*/
  191.   fseek(Tmp, 0, SEEK_END);
  192.   Len=ftell(Tmp);
  193.   fseek(Tmp, 0, SEEK_SET);
  194.  
  195.  
  196.   if(CopyBlock(Tmp, fBox, 0, Len)!=0)
  197.     { perror("Can't copy TmpBox to mailbox");
  198.       fclose(Tmp);
  199.       unlink(TmpPath);
  200.       fclose(fBox);
  201.       return(-1);
  202.     }
  203.  
  204.   fclose(Tmp);
  205.   unlink(TmpPath);
  206.  
  207.  
  208. /*Check for new mail*/
  209.   if(access(rBoxPath, 0)==0)
  210.     { /*If exist rBox (rBoxPath=user.) append it to maildrop, 
  211.       currently in fBox (mBoxPath=user.mb)*/
  212.       errno=0;
  213.       rBox=_fsopen(rBoxPath, "r+b", SH_DENYRW);
  214.       if(rBox==NULL)
  215.         { perror("Can't open original maildrop");
  216.           fclose(fBox);
  217.           return(-1);
  218.         }
  219.  
  220.       fseek(rBox, 0, SEEK_END);
  221.       Len=ftell(rBox);
  222.       fseek(rBox, 0, SEEK_SET);
  223.  
  224.       if(Len>0)
  225.         { if(CopyBlock(rBox, fBox, 0, Len)!=0)
  226.             { perror("Can't append maildrop to original");
  227.               fclose(rBox);
  228.               fclose(fBox);
  229.               return(-1);
  230.             }
  231.         }
  232.       fclose(rBox);
  233.     }
  234.  
  235.  
  236.   fclose(fBox);
  237.   fBox=_fsopen(mBoxPath, "r+b", SH_DENYRW);
  238.   if(fBox==NULL)
  239.     { perror("Can't reopen mailbox");
  240.       return(-1);
  241.     }
  242.  
  243. /*Done, moving fBox to rBox*/
  244.   rBox=_fsopen(rBoxPath, "wb", SH_DENYRW);
  245.   if(rBox==NULL)
  246.     { perror("Can't reopen original maildrop");
  247.       fclose(fBox);
  248.       return(-1);
  249.     }
  250.  
  251.   fseek(fBox, 0, SEEK_END);
  252.   Len=ftell(fBox);
  253.   if(Len<0)
  254.     { perror("Can't read maildrop");
  255.       return(-1);
  256.     }
  257.       
  258.   if(CopyBlock(fBox, rBox, 0l, Len)!=0)
  259.     { perror("Can't append mailbox to main maildrop : some mails wasted");
  260.     }
  261.   fclose(rBox);
  262.   fclose(fBox);
  263.   unlink(mBoxPath);
  264.  
  265.   return(0);
  266. }
  267.  
  268.  
  269.