+static void lar_md5( char *md5, const char *data, int len )
+{
+ md5_state_t state;
+
+ md5_init(&state);
+ md5_append(&state, (const md5_byte_t *)data, len);
+ md5_finish(&state, (md5_byte_t *)md5);
+}
+
+static int lar_read_filenames( lar_archive *ar )
+{
+ int i;
+ int j;
+ char *filelist;
+ size_t pgof;
+ size_t pgsz = getpagesize();
+ lar_index *idx_ptr;
+ lar_index *idx_filelist = ar->index;
+
+ while(idx_filelist)
+ {
+ if( idx_filelist->type == LAR_TYPE_FILELIST )
+ break;
+
+ idx_filelist = idx_filelist->next;
+ }
+
+ if( idx_filelist != NULL )
+ {
+ pgof = ( idx_filelist->offset % pgsz );
+
+ filelist = mmap(
+ 0, idx_filelist->length + pgof, PROT_READ, MAP_PRIVATE,
+ ar->fd, idx_filelist->offset - pgof
+ );
+
+ if( filelist == MAP_FAILED )
+ LAR_DIE("Failed to mmap() file list");
+
+
+ idx_ptr = ar->index;
+ i = pgof;
+
+ while(idx_ptr)
+ {
+ if( idx_ptr->type == LAR_TYPE_REGULAR )
+ {
+ j = strlen(&filelist[i]) + 1;
+
+ if( (j >= LAR_FNAME_BUFFER) ||
+ ((i+j) > (idx_filelist->length+pgof)) )
+ LAR_DIE("Filename exceeds maximum allowed length");
+
+ idx_ptr->filename = (char *)malloc(j);
+ memcpy(idx_ptr->filename, &filelist[i], j);
+
+ i += j;
+ }
+
+ idx_ptr = idx_ptr->next;
+ }
+
+ munmap(filelist, idx_filelist->length + pgof);
+
+ return 1;
+ }
+
+ return 0;
+}
+