
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define BUF1_LEN 0x2000
#define BUF2_LEN 0x3000
#define BUF3_LEN (BUF1_LEN + BUF2_LEN)

int main(int argc, char *argv[])
{
	int fd;
	static char buf1[BUF1_LEN], buf2[BUF2_LEN], buf3[BUF3_LEN];

	fd = open("/proc/kcore", O_RDONLY);
	if (fd == -1) {
		fprintf(stderr, "open(), errno=%d (%s)\n", errno, strerror(errno));
		exit(1);
	}
	if (read(fd, buf1, BUF1_LEN) != BUF1_LEN) {
		fprintf(stderr, "read(buf1, BUF1_LEN), 
			errno=%d (%s)\n", errno, strerror(errno));
		exit(1);
	}
	if (read(fd, buf2, BUF2_LEN) != BUF2_LEN) {
		fprintf(stderr, "read(buf2, BUF2_LEN), 
			errno=%d (%s)\n", errno, strerror(errno));
		exit(1);
	}
	if (lseek(fd, 0, SEEK_SET) == -1) {	
		fprintf(stderr, "lseek(0), 
			errno=%d (%s)\n", errno, strerror(errno));
		exit(1);
	}
	if (read(fd, buf3, BUF3_LEN) != BUF3_LEN) {
		fprintf(stderr, "read(buf3, BUF3_LEN), 
			errno=%d (%s)\n", errno, strerror(errno));
		exit(1);
	}
	if (memcmp(buf3, buf1, BUF1_LEN) != 0) 
		fprintf(stderr, "Error: buf3 != buf1\n");
	if (memcmp(buf3+BUF1_LEN, buf2, BUF2_LEN) != 0) 
		fprintf(stderr, "Error: buf3+BUF1_LEN != buf2\n");
	(void)close(fd);
	return 0;
}
