static char rcsid[] = "@(#)$Id: mmaputil.c,v 1.6 2006/04/09 07:37:08 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.6 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
 *****************************************************************************/

#include "headers.h"
#include "mmaputil.h"
#include <errno.h>
#ifndef ANSI_C
extern int errno;
#endif

DEBUG_VAR(Debug,__FILE__,"charset");

uint16 SWAP (b)
     int b;
{
    union {
	uint16 a;
	unsigned char c[2];
    } d;
    unsigned char tmp;
    d.a = b;
   
    if (sizeof d.a != 2) {
	panic("MMAP PANIC",__FILE__,__LINE__,"SWAP",
	      "sizeof uint16 !=2 -- 'Configure' error!",0);
    }
    tmp = d.c[0]; d.c[0] = d.c[1]; d.c[1] = tmp;
    return d.a;
}


uint16 pages(len,pagesize)
     size_t len;
     int pagesize; 
{
    uint16 result = len / pagesize;

    if (len % pagesize != 0)
	result++;
    return result;
}

int write_range(fd,offset,length,ptr)
     int fd; 
     off_t offset; 
     size_t length;
     unsigned char *ptr;
{
    int status = 1;

    if (-1 == lseek(fd,offset,SEEK_SET)) {
	int err = errno;
	status = 0;

	DPRINT(Debug,5,(&Debug,"unidata: lseek failed: errno=%d (%s)\n", \
			err,error_description(err))); 

	goto fail;
    }

    while (length > 0) {
	int n = write(fd,ptr,length);

	if (-1 == n) {
	    int err = errno;
	    status = 0;

	    DPRINT(Debug,5,(&Debug,"unidata: write failed: errno=%d (%s)\n", \
			    err,error_description(err))); 

	    goto fail;
	}
	length -= n;
	ptr    += n;
    }

 fail:
    return status;
}


int read_range(fd,offset,length,ptr)
     int fd; 
     off_t offset; 
     size_t length;
     unsigned char *ptr;
{
    int status = 1;
    if (-1 == lseek(fd,offset,SEEK_SET)) {
	status = 0;
	goto fail;
    }

    while (length > 0) {
	int n = read(fd,ptr,length);

	if (-1 == n) {
	    status = 0;
	    goto fail;
	}
	if (0 == n) {
	    errno = EINVAL;  /* Simulate error */
	    status = 0;
	    goto fail;
	}

	length -= n;
	ptr    += n;
    }

 fail:
    return status;
}

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1