/*
 * $Id: newsrc.c,v 1.3 2002/06/06 14:46:31 conrads Exp $
 * 
 * routines for dealing with the local newsrc(s)
 */

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

#include "msuck.h"

extern char *newsrc_path_template;

/*
 * open a newsrc file and map it into memory
 * 
 * Allocates and fills in the newsrc struct within the server struct provided as
 * its argument
 * 
 * Returns numgroups on success, -1 on failure
 */
int
load_newsrc(SERVER * server)
{
	struct stat newsrc_stat;
	char *ptr;
	int i;

	if ((server->newsrc = malloc(sizeof(NEWSRC))) == NULL)
	{
		perror("load_newsrc()");
		return -1;
	}

	/* get size of newsrc */
	snprintf(server->newsrc->pathname, PATH_MAX, newsrc_path_template, server->hostname);

	if (stat(server->newsrc->pathname, &newsrc_stat) != 0)
	{
		perror(server->newsrc->pathname);
		return -1;
	}

	server->newsrc->size = newsrc_stat.st_size;

	/* open newsrc file */
	if ((server->newsrc->fd = open(server->newsrc->pathname, O_RDWR)) == -1)
	{
		perror(server->newsrc->pathname);
		return -1;
	}

	/* map file into memory */
	server->newsrc->addr = mmap(NULL, server->newsrc->size,
	       (PROT_READ | PROT_WRITE), MAP_SHARED, server->newsrc->fd, 0);

	/*
	 * close the file descriptor (not needed when working with mmapped files)
	 */
	close(server->newsrc->fd);
	
	/* Setup newsrc array of pointers to fields in newsrc file */
	ptr = server->newsrc->addr;

	for (i = 0; (ptr < (server->newsrc->addr + server->newsrc->size)) && (i < MAX_REMOTE_GROUPS); ++i)
	{
		server->newsrc->mmapped[i].group = ptr;
		while (*ptr++ != ' ');
		server->newsrc->mmapped[i].lastart = ptr;
		while (*ptr++ != '\n');
	}
	return i;
}


syntax highlighted by Code2HTML, v. 0.9.1