view objgrep/lowlevel.c @ 215:d69f7512e3c1

Pirelli: documented and verified the checksum scheme used for the factory block
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 25 Dec 2016 23:48:16 +0000
parents c25367bb7656
children
line wrap: on
line source

/*
 * This C module implements the low-level steps of file mapping and access.
 */

#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "globals.h"

mmap_objfile()
{
	int fd;
	struct stat st;

	fd = open(objfilename, O_RDONLY);
	if (fd < 0) {
		perror(objfilename);
		exit(2);
	}
	fstat(fd, &st);
	if (!S_ISREG(st.st_mode)) {
		fprintf(stderr, "error: %s is not a regular file\n",
			objfilename);
		exit(2);
	}
	objfile_tot_size = st.st_size;
	objfilemap = mmap(NULL, objfile_tot_size, PROT_READ, MAP_PRIVATE,
			  fd, 0L);
	if (objfilemap == MAP_FAILED) {
		perror("mmap");
		exit(2);
	}
	close(fd);
}

mmap_binfile()
{
	int fd;
	struct stat st;

	fd = open(binfilename, O_RDONLY);
	if (fd < 0) {
		perror(binfilename);
		exit(2);
	}
	fstat(fd, &st);
	if (!S_ISREG(st.st_mode)) {
		fprintf(stderr, "error: %s is not a regular file\n",
			binfilename);
		exit(2);
	}
	binfile_tot_size = st.st_size;
	binfilemap = mmap(NULL, binfile_tot_size, PROT_READ, MAP_PRIVATE,
			  fd, 0L);
	if (binfilemap == MAP_FAILED) {
		perror("mmap");
		exit(2);
	}
	close(fd);
}

unsigned
get_u16(ptr)
	u_char *ptr;
{
	return ptr[0] | ptr[1] << 8;
}

get_s16(ptr)
	u_char *ptr;
{
	int i;

	i = ptr[0] | ptr[1] << 8;
	if (i >= 32768)
		i -= 65536;
	return(i);
}

unsigned
get_u32(ptr)
	u_char *ptr;
{
	return ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24;
}