Esempio n. 1
0
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);
		}
	}
}
Esempio n. 2
0
File: psort.c Progetto: BWK/os161
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);
}
Esempio n. 3
0
File: psort.c Progetto: BWK/os161
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);
	}
}
Esempio n. 4
0
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));
}
Esempio n. 5
0
File: psort.c Progetto: BWK/os161
static
void
seekmyplace(const char *name, int fd)
{
	int keys_per, myfirst;
	off_t offset;

	keys_per = numkeys / numprocs;
	myfirst = me*keys_per;
	offset = myfirst * sizeof(int);

	dolseek(name, fd, offset, SEEK_SET);
}