static void partition(int fd, int bsize, Header *h) { ulong nblock, ndata, nlabel; ulong lpb; if(bsize % 512 != 0) sysfatal("block size must be a multiple of 512 bytes"); if(bsize > VtMaxLumpSize) sysfatal("block size must be less than %d", VtMaxLumpSize); memset(h, 0, sizeof(*h)); h->blockSize = bsize; lpb = bsize/LabelSize; nblock = fdsize(fd)/bsize; /* sanity check */ if(nblock < (HeaderOffset*10)/bsize) vtFatal("file too small"); h->super = (HeaderOffset + 2*bsize)/bsize; h->label = h->super + 1; ndata = ((u64int)lpb)*(nblock - h->label)/(lpb+1); nlabel = (ndata + lpb - 1)/lpb; h->data = h->label + nlabel; h->end = h->data + ndata; }
int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "usage: %s file.ldif\n", argv[0]); return 1; } char *ldif_fn = argv[1]; int fd = open(ldif_fn, O_RDONLY); if (fd < 0) { fprintf(stderr, "Unable to open %s: %s\n", ldif_fn, strerror(errno)); exit(1); } size_t ldif_len = fdsize(fd); if (ldif_len == 0) { puts("0"); goto close; } void *ldif_mm = mmap(0, ldif_len, PROT_READ, MAP_FILE | MAP_NOCACHE | MAP_SHARED, fd, 0); if (MAP_FAILED == ldif_mm) { fprintf(stderr, "Unable to memory map %s: %s\n", ldif_fn, strerror(errno)); exit(2); } // size_t num_newlines = count_newlines(ldif_mm, ldif_len); // printf("%llu\n", (unsigned long long)num_newlines); dump_cns(ldif_mm, ldif_len); munmap(ldif_mm, ldif_len); close: close(fd); }