--- mmc.c.orig	2014-12-10 20:53:22 UTC
+++ mmc.c
@@ -83,6 +83,9 @@ typedef struct MapStruct {
     time_t ct;
     int refcount;
     time_t reftime;
+#ifdef USE_SENDFILE
+    int fd;
+#endif
     void* addr;
     unsigned int hash;
     int hash_idx;
@@ -149,7 +152,11 @@ mmc_map( char* filename, struct stat* sb
 	/* Yep.  Just return the existing map */
 	++m->refcount;
 	m->reftime = now;
+#ifdef USE_SENDFILE
+	return (&m->fd);
+#else
 	return m->addr;
+#endif
 	}
 
     /* Open the file. */
@@ -195,7 +202,9 @@ mmc_map( char* filename, struct stat* sb
     else
 	{
 	size_t size_size = (size_t) m->size;	/* loses on files >2GB */
-#ifdef HAVE_MMAP
+#ifdef USE_SENDFILE
+	m->fd = fd;
+#elif defined(HAVE_MMAP)
 	/* Map the file into memory. */
 	m->addr = mmap( 0, size_size, PROT_READ, MAP_PRIVATE, fd, 0 );
 	if ( m->addr == (void*) -1 && errno == ENOMEM )
@@ -243,8 +252,9 @@ mmc_map( char* filename, struct stat* sb
 	    }
 #endif /* HAVE_MMAP */
 	}
+#ifndef USE_SENDFILE
     (void) close( fd );
-
+#endif /* !USE_SENDFILE */
     /* Put the Map into the hash table. */
     if ( add_hash( m ) < 0 )
 	{
@@ -262,8 +272,12 @@ mmc_map( char* filename, struct stat* sb
     /* Update the total byte count. */
     mapped_bytes += m->size;
 
+#ifdef USE_SENDFILE
+    return (&m->fd);
+#else
     /* And return the address. */
     return m->addr;
+#endif
     }
 
 
@@ -276,14 +290,18 @@ mmc_unmap( void* addr, struct stat* sbP,
     if ( sbP != (struct stat*) 0 )
 	{
 	m = find_hash( sbP->st_ino, sbP->st_dev, sbP->st_size, sbP->st_ctime );
+#ifndef USE_SENDFILE
 	if ( m != (Map*) 0 && m->addr != addr )
 	    m = (Map*) 0;
+#endif
 	}
+#ifndef USE_SENDFILE
     /* If that didn't work, try a full search. */
     if ( m == (Map*) 0 )
 	for ( m = maps; m != (Map*) 0; m = m->next )
 	    if ( m->addr == addr )
 		break;
+#endif
     if ( m == (Map*) 0 )
 	syslog( LOG_ERR, "mmc_unmap failed to find entry!" );
     else if ( m->refcount <= 0 )
@@ -372,7 +390,9 @@ really_unmap( Map** mm )
     m = *mm;
     if ( m->size != 0 )
 	{
-#ifdef HAVE_MMAP
+#ifdef USE_SENDFILE
+	close(m->fd);
+#elif defined(HAVE_MMAP)
 	if ( munmap( m->addr, m->size ) < 0 )
 	    syslog( LOG_ERR, "munmap - %m" );
 #else /* HAVE_MMAP */