static void dumpdata(void) { struct indexentry x; off_t indexsize, pos, done; size_t amount, len; indexsize = dolseek(indexfd, indexname, 0, SEEK_CUR); pos = indexsize; assert(pos % sizeof(x) == 0); while (pos != 0) { pos -= sizeof(x); dolseek(indexfd, indexname, pos, SEEK_SET); len = doread(indexfd, indexname, &x, sizeof(x)); if (len != sizeof(x)) { errx(1, "%s: read: Unexpected EOF", indexname); } dolseek(datafd, dataname, x.pos, SEEK_SET); for (done = 0; done < x.len; done += amount) { amount = sizeof(buf); if ((off_t)amount > x.len - done) { amount = x.len - done; } len = doread(datafd, dataname, buf, amount); if (len != amount) { errx(1, "%s: read: Unexpected short count" " %zu of %zu", dataname, len, amount); } dowrite(STDOUT_FILENO, "stdout", buf, len); } } }
static void assemble(void) { off_t mypos; int i, fd; const char *args[3]; mypos = 0; for (i=0; i<me; i++) { mypos += getsize(mergedname(i)); } fd = doopen(PATH_SORTED, O_WRONLY, 0); dolseek(PATH_SORTED, fd, mypos, SEEK_SET); if (dup2(fd, STDOUT_FILENO) < 0) { complain("dup2"); exit(1); } doclose(PATH_SORTED, fd); args[0] = "cat"; args[1] = mergedname(me); args[2] = NULL; execv("/bin/cat", (char **) args); complain("/bin/cat: exec"); exit(1); }
static void sortbins(void) { const char *name; int i, fd; off_t binsize; for (i=0; i<numprocs; i++) { name = binname(me, i); binsize = getsize(name); if (binsize % sizeof(int) != 0) { complainx("%s: bin size %ld no good", name, (long) binsize); exit(1); } if (binsize > (off_t) sizeof(workspace)) { complainx("proc %d: %s: bin too large", me, name); exit(1); } fd = doopen(name, O_RDWR, 0); doexactread(name, fd, workspace, binsize); sortints(workspace, binsize/sizeof(int)); dolseek(name, fd, 0, SEEK_SET); dowrite(name, fd, workspace, binsize); doclose(name, fd); } }
static void writeheader(const char *file, int fd) { char buf[SECTORSIZE]; memset(buf, 0, sizeof(buf)); strcpy(buf, HEADERSTRING); dolseek(file, fd, 0, SEEK_SET); dowrite(file, fd, buf, sizeof(buf)); }