/*
* $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