title: MMAP reading and writing files
body: <p>Im trying to use mmap to read in a file and then encrypt it and then write the encryption to the output file. I'm trying to also do this with mmap but when I run the code, it tells me that it was not able to unmmap due to "Invalid Argument".</p>
  
  <pre><code>//Open files initialy and obtain a handle to the file.
  inputFile = open(inFileName, O_RDONLY, S_IREAD);
  outputFile = open(outFileName, O_APPEND | O_CREAT | O_TRUNC | O_WRONLY, S_IWRITE);
  
  //Allocate buffers for encrption.
  from = (unsigned char*)malloc(blockSize);
  to = (unsigned char*)malloc(blockSize);
  
  mmapWriteBuff = (unsigned char*)malloc(blockSize);
  mmapReadBuff = (unsigned char*)malloc(blockSize);
  
  memset(to, 0, blockSize);
  memset(from, 0, blockSize);
  memset(mmapWriteBuff, 0, blockSize);
  memset(mmapReadBuff, 0, blockSize);
  
  //Make sure we have permission to read the file provided.
  setFilePermissions(inFileName, PERMISSION_MODE);
  setFilePermissions(outFileName, PERMISSION_MODE);
  
  if(encriptParam)
  {
      printf("*Encripting file: %s *\n", inFileName);
  
  do//Go through the entire file.
  {   
      if(memParam)
      {
              currAmt = lseek(inputFile, blockSize, SEEK_SET);
          mmapReadBuff = mmap(0, blockSize, PROT_READ, MAP_SHARED, inputFile, 0);
  
          /*
           *This is how you encrypt an input char* buffer "from", of length "len"
           *onto output buffer "to", using key "key".  Jyst pass "iv" and "&amp;n" as
           *shown, and don't forget to actually tell the function to BF_ENCRYPT.
           */
  
          BF_cfb64_encrypt(mmapReadBuff, mmapWriteBuff, blockSize, &amp;key, iv, &amp;n, BF_ENCRYPT);
  
          if(currAmt &lt; blockSize)
          {
              writeAmt = lseek(outputFile, currAmt, SEEK_SET);
              mmapWriteBuff = mmap(0, currAmt, PROT_WRITE,  MAP_SHARED, outputFile, 0);                   
              if(errno == EINVAL)
              {
                  perror("MMAP failed to start write buffer: ");
  
                  exit(MMAP_IO_ERROR);
              }
          }
          else
          {
              writeAmt = lseek(outputFile, blockSize, SEEK_SET);
              mmapWriteBuff = mmap(0, blockSize, PROT_WRITE, MAP_SHARED, outputFile, 0);                  
              if(errno == EINVAL)
              {
                  perror("MMAP failed to start write buffer: ");
  
                  exit(MMAP_IO_ERROR);
              }
          }
  
          mmapWriteBuff = to;
      }
      else
      {
          currAmt = read(inputFile, from, blockSize);
  
          /*
           *This is how you encrypt an input char* buffer "from", of length "len"              *onto output buffer "to", using key "key".  Jyst pass "iv" and "n" as
           *shown, and don't forget to actually tell the function to BF_ENCRYT.
          */
  
          BF_cfb64_encrypt(from, to, blockSize, &amp;key, iv, &amp;n, BF_ENCRYPT);
  
          if(currAmt &lt; blockSize)
          {
              writeAmt = write(outputFile, to, currAmt);
          }
          else
          {
              writeAmt = write(outputFile, to, blockSize);
          }
      }
  
      if(memParam)
      {
          //if(currAmt &lt; blockSize)
          //{
          //  if(munmap(mmapWriteBuff, currAmt) == -1)
          //  {
          //      perror("MMAP failed to unmap itself: ");
          //      
          //      exit(MMAP_IO_ERROR);
          //  }
          //  
          //  if(munmap(mmapReadBuff, currAmt) == -1)
          //  {
          //      perror("MMAP failed to unmap itself: ");
          //      
          //      exit(MMAP_IO_ERROR);
          //  }
          //}
          //else
          //{
  
              if(munmap(mmapReadBuff, blockSize) == -1)
              {
                  perror("MMAP Read Buffer failed to unmap itself: ");
  
                  exit(MMAP_IO_ERROR);
              }
  
              if(munmap(mmapWriteBuff, blockSize) == -1)
              {
                  perror("MMAP Write Buffer failed to unmap itself: ");                       
                  exit(MMAP_IO_ERROR);
              }
  
  
          //}
  
      }
  
      memset(to, 0, strlen((char *)to));
      memset(from, 0, strlen((char *)from));
      memset(mmapReadBuff, 0, strlen((char*)mmapReadBuff));
      memset(mmapWriteBuff, 0, strlen((char*)mmapWriteBuff));
      }
      while(currAmt &gt; 0);
  
      printf("*Saving file: %s *\n", outFileName);
  </code></pre>
  
  <p>}</p>