/*
* supernews.c (crap name, huh?)
*/
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include "config.h"
#include "player.h"
#include "fix.h"
int fd;
off_t point;
int unique_id = 1;
snews *first_snews;
/* Atm, load the entire stuff in memory when called for */
snews *read_line()
{
char *oldstack, *mark;
snews *new;
int len;
oldstack = stack;
new = (snews *) malloc(sizeof(snews));
/*
* fucking bodge, cos I can't see how to do it line_by_line read onto stack
*/
if (!read(fd, stack, 1))
return 0;
lseek(fd, -1, SEEK_CUR);
do
{
read(fd, stack, 1);
mark = stack;
stack++;
} while (*mark && *mark != '\n');
*stack++ = 0;
len = strlen(oldstack);
new->text = (char *) malloc(len + 2);
strcpy(new->text, oldstack);
new->ident = unique_id++;
new->next = 0;
stack = oldstack;
return new;
}
void load_supernews(void)
{
char *oldstack;
snews *article, *prev;
int len;
fd = open("files/notes/snews", O_RDONLY | O_NDELAY);
if (fd < 0)
{
tell_current("Couldn't open file.\n");
return;
}
point = lseek(fd, 0, SEEK_SET);
unique_id = 1;
first_snews = read_line();
if (!first_snews)
{
close(fd);
return;
}
prev = first_snews;
do
{
article = read_line();
prev->next = article;
prev = article;
} while (article);
close(fd);
}
void load_line(char *str)
{
snews *new;
int len;
new = (snews *) malloc(sizeof(snews));
if (!first_news)
{
first_news = new;
}
len = strlen(str);
strncpy(new->text, str, (MAX_SNEWS - 2));
new->ident = unique_id++;
new->next = 0:
void load_supernews(void)
{
FILE *fp;
char *oldstack;
fp = fopen("files/notes/snews", "r");
if (!fp)
{
printf("wibble\n");
return;
}
fgets(stack, MAX_SNEWS + 1, fp);
while (!feof(fp))
{
load_line(stack);
fgets(stack, 500, fp);
}
fclose(fp);
}
void cleanup(void)
{
snews *scan, *prev;
if (!first_snews)
return;
scan = first_snews;
do
{
prev = scan;
scan = scan->next;
if (prev->text)
free(prev->text);
free(prev);
} while (scan);
first_snews = 0;
}
void read_newssuper(player * p, char *str)
{
char *oldstack;
snews *scan;
load_supernews();
if (!first_snews)
{
tell_player(p, "There are no postings to read.\n");
return;
}
oldstack = stack;
strcpy(stack, "Super user news postings ---\n\n");
for (scan = first_snews; scan; scan = scan->next)
{
sprintf(stack, "[%d] %s", scan->ident, scan->text);
stack = (char *) strchr(stack, 0);
}
stack++;
pager(p, oldstack, 0);
cleanup();
stack = oldstack;
}
void post_newssuper(player * p, char *str)
{
char *oldstack;
if (!*str)
{
tell_player(p, "Format: swrite <message>\n");
return;
}
fd = open("files/notes/snews", O_SYNC | O_WRONLY | O_APPEND | O_CREAT,
S_IRUSR | S_IWUSR);
if (fd < 0)
{
tell_player(p, "meep, couldn't open file.\n");
return;
}
sprintf(stack, "%s - %s\n", p->name, str);
if (!write(fd, stack, strlen(stack)))
tell_player(p, "Meep, couldn't write !\n");
tell_player(p, "Posted to super bulletin board.\n");
close(fd);
}
void save_snews(void)
{
char *oldstack;
snews *scan;
oldstack = stack;
scan = first_snews;
while (scan)
{
strcpy(stack, scan->text);
stack = (char *) strchr(stack, 0);
scan = scan->next;
}
stack++;
fd = open("files/notes/snews", O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd < 0)
{
tell_current("Couldn't open file.\n");
return;
}
if (!write(fd, oldstack, strlen(oldstack)))
tell_current("meep, couldn't save file.\n");
close(fd);
stack = oldstack;
}
void remove_newssuper(player * p, char *str)
{
int art = 0, num;
snews *scan, *prev;
art = atoi(str);
if (!art)
{
tell_player(p, "Format: swipe <no>\n");
return;
}
load_supernews();
if (unique_id > art)
{
tell_player(p, "That note doesn't exist.\n");
return;
}
scan = first_snews;
while (scan->ident != art)
{
prev = scan;
scan = scan->next;
}
prev->next = scan->next;
save_snews();
cleanup();
}