/* Copyright (C) 1991, Marcus J. Ranum. All rights reserved. */ #ifndef lint static char RCSid[] = "$Header: /usr/users/mjr/hacks/umud/CMD/RCS/news.c,v 1.3 91/09/23 16:10:05 mjr Exp $"; #endif /* configure all options BEFORE including system stuff. */ #include "config.h" #ifdef NOSYSTYPES_H #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <ctype.h> #include "mud.h" #include "vars.h" static int deletepost(who,aswho,num) char *who; char *aswho; int num; { char nfbuf[640]; if(!ut_flagged(aswho,var_wiz)){ say(who,"Only a wizard can delete a news item.\n",(char *)0); return(1); } (void)sprintf(nfbuf,"NEWS/%d",num); if(unlink(nfbuf)){ say(who,"Could not delete news item!\n",(char *)0); return(1); } say(who,"Deleted.\n",(char *)0); return(0); } static int post(who,message) char *who; char *message; { FILE *fp; int newart; char nfbuf[640]; time_t now; extern char *ctime(); /* access and increment the system top article ID */ if(ut_getnum(system_object,var_newsart,&newart)) newart = 0; newart = newart + 1; /* try to open the file for output */ (void)sprintf(nfbuf,"NEWS/%d",newart); if((fp = fopen(nfbuf,"w")) == (FILE *)0) { say(who,"Cannot create new article\n",(char *)0); return(1); } /* if the file open worked, increment the system article count. */ if(ut_setnum(who,system_object,var_newsart,newart)) { (void)fclose(fp); (void)unlink(nfbuf); say(who,"System error. Could not post.\n",(char *)0); return(1); } /* we now have the article # and the file open. go for it. */ (void)time(&now); /* naughty, naughty */ (void)fprintf(fp," -- Article #%d, posted by %s(%s), %s%s\n", newart,ut_name(who),who,ctime(&now),message); (void)fclose(fp); say(who,"Posted.\n",(char *)0); return(0); } /* ARGSUSED */ cmd_NEWS(argc,argv,who,aswho) int argc; char *argv[]; char *who; char *aswho; { int anum; int nnum; int topart; char *ap; char nfbuf[640]; char nxbuf[64]; int setflg = 0; if((ap = ut_getatt(who,0,typ_int,var_newsart,(char *)0)) != (char *)0) anum = atoi(ap); else anum = 0; if(argc == 1) nnum = anum + 1, setflg++; else if(argc == 2 && !strncmp(argv[1],"next",strlen(argv[1]))) nnum = anum + 1, setflg++; else if(argc == 2 && !strncmp(argv[1],"previous",strlen(argv[1]))) nnum = anum - 1; else if(argc >= 2 && !strncmp(argv[1],"post",strlen(argv[1]))) { if(argc != 3) { say(who,"Usage: ",argv[0]," post message-text\n",(char *)0); return(1); } return(post(who,argv[2])); } else if(argc >= 2 && !strncmp(argv[1],"goto",strlen(argv[1]))) { if(argc != 3) { say(who,"Usage: ",argv[0]," goto message-number\n",(char *)0); return(1); } nnum = atoi(argv[2]); setflg++; } else if(argc >= 2 && !strncmp(argv[1],"delete",strlen(argv[1]))) { if(argc != 3) { say(who,"Usage: ",argv[0]," delete message-number\n",(char *)0); return(1); } nnum = atoi(argv[2]); return(deletepost(who,aswho,nnum)); } else if(argc == 2 && isdigit(argv[1][0])) nnum = atoi(argv[1]); else { say(who,argv[0]," [next]\n",(char *)0); say(who,argv[0]," previous\n",(char *)0); say(who,argv[0]," post message-text\n",(char *)0); say(who,argv[0]," delete message-number\n",(char *)0); say(who,argv[0]," [goto] message-number\n",(char *)0); return(1); } if(nnum <= 0) { say(who,itoa(nnum,nxbuf)," isn't a valid article.\n",(char *)0); return(1); } if(ut_getnum(system_object,var_newsart,&topart)){ say(who,"There's no news.\n",(char *)0); return(0); } do{ (void)sprintf(nfbuf,"NEWS/%d",nnum); if(say_file(who,nfbuf)) { say(who,"no article ",itoa(nnum,nxbuf),"\n",(char *)0); nnum++; } else { say(who," -- End Article ",itoa(nnum,nxbuf),"\n",(char *)0); break; } } while(nnum <= topart && setflg); nnum = (nnum > topart ? topart : nnum); /* update ".newsrc" */ if(setflg) { if(ut_set(who,who,typ_int,var_newsart,itoa(nnum,nxbuf))) return(1); } return(0); }