Listing 4. mmap.c

/******************************************
 * mmap(2) file write                     *
 *                                        *
 *****************************************/
         caddr_t *mm = NULL;

         fd = open (filename, O_RDWR | O_TRUNC | O_CREAT, 0644);

        if(-1 == fd)
        errx(1, "File write");
        /* NOT REACHED */

        /* If you don't do this, mmapping will never
         * work for writing to files
         * If you don't know file size in advance as is
         * often the case with data streaming from the
         * network, you can use a large value here. Once you
         * write out the whole file, you can shrink it
         * to the correct size by calling ftruncate
         * again
         */
        ret = ftruncate(ctx->fd,filelen);

        mm = mmap(NULL, header->filelen, PROT_READ | PROT_WRITE,
                        MAP_SHARED, ctx->fd, 0);
        if (NULL == mm)
        errx(1, "mmap() problem");
        memcpy(mm + off, buf, len);
        off += len;
        /* Please don't forget to free mmap(2)ed memory!  */
        munmap(mm, filelen);
        close(fd);


        /******************************************
         * mmap(2) file read                      *
         *                                        *
         *****************************************/
        fd = open(filename, O_RDONLY, 0);
        if ( -1 == fd)
        errx(1, " File read err");
        /* NOT REACHED */

        fstat(fd, &statbf);
        filelen = statbf.st_size;

        mm = mmap(NULL, filelen, PROT_READ, MAP_SHARED, fd, 0);

        if (NULL == mm)
        errx(1, "mmap() error");
        /* NOT REACHED */

        /* Now onward you can straightaway
         * do a memory copy of the mm pointer as it
         * will dish out file data to you
         */


        bufptr = mm + off;
        /* You can straightaway copy mmapped memory into the
           network buffer for sending */
        memcpy(pkt.buf + filenameoff, bufptr, bytes);

        /* Please don't forget to free mmap(2)ed memory!  */
        munmap(mm, filelen);
        close(fd);

