/* * $Id: newsrc.c,v 1.3 2002/06/06 14:46:31 conrads Exp $ * * routines for dealing with the local newsrc(s) */ #include #include #include #include #include #include #include #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; }