home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / dominion / part27 / news.c < prev    next >
C/C++ Source or Header  |  1992-02-11  |  6KB  |  251 lines

  1. /*
  2.  * Copyright (C) 1990 Free Software Foundation, Inc.
  3.  * Written by the dominion project.
  4.  *
  5.  * This file is part of dominion.
  6.  *
  7.  * dominion is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License as published
  9.  * by the Free Software Foundation; either version 1, or (at your option)
  10.  * any later version.
  11.  *
  12.  * This software is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this software; see the file COPYING.  If not, write to
  19.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  */
  21.  
  22. #include "dominion.h"
  23. #include "news.h"
  24. #include <stdio.h>
  25. #ifdef AMIGA
  26. #  include <exec/types.h>
  27. #  define sleep(x) Delay(x*50)
  28. #else
  29. #  include <sys/types.h>
  30. #endif
  31. #include <time.h>
  32. #ifdef SYSV
  33. #  include <string.h>
  34. #else
  35. #  include <strings.h>
  36. #endif
  37.  
  38. extern Sworld world;
  39. extern Suser user;
  40.  
  41. char *news_post()
  42. {
  43.     FILE *file;
  44.     static char buffer[1024];
  45.     char *ptr;
  46.  
  47.     sprintf(buffer, "news.post");
  48.     if (file = fopen(buffer, "r")) {
  49.     fgets(buffer, sizeof(buffer), file);
  50.     fclose(file);
  51.     ptr = buffer + strlen(buffer) - 1;
  52.     if (*ptr == '\n')
  53.         *ptr = '\0';
  54.     return buffer;
  55.     }
  56.     else
  57.     return NULL;
  58. }
  59.  
  60. int valid_group(name,posting)
  61. char *name;
  62. int posting;
  63. {
  64.   char news_dir[100],g_fn[100],in[100];
  65.   char post_in;
  66.   FILE *g_fp;
  67.   int ret = 0;
  68.   char out[100];
  69.   char s_in[100];
  70.  
  71.   sprintf(news_dir,"%s",NEWS_DIR);
  72.   sprintf(g_fn,"%s/%s",news_dir,NGDB_FILE);
  73.   
  74.   g_fp=fopen(g_fn,"r");
  75.   if (g_fp!=NULL)
  76. /*    while((fscanf(g_fp,"%s %*d %*d %*c",in))>0)*/
  77.     while((fgets(s_in,100,g_fp))!=NULL)
  78.       {
  79.     s_in[strlen(s_in)-1] = '\0';
  80.     sscanf(s_in,"%s %*d %*d %c",in,&post_in);
  81.     if((!posting)&&(!strcmp(in,name)))
  82.       ret=1;
  83.     else
  84.       if((posting)&&(!strcmp(in,name))&&(post_in=='1'))
  85.         ret=1;
  86.       }
  87.   if (g_fp != NULL) { fclose(g_fp); }
  88.   return(ret);
  89. } /* valid_group */
  90.     
  91. s_group *group_find(first,name)
  92. s_group *first;
  93. char *name;
  94. {
  95.   s_group *loop,*ret;
  96.   ret=NULL;
  97.   for (loop=first;loop!=NULL;loop=loop->next)
  98.     if (!strcmp(name,loop->name))
  99.       ret=loop;
  100.   return(ret);
  101. } /* group_find */
  102.       
  103. /* This checks if someone else is adding an article (ie it's locked) */
  104.  
  105. int check_news_lock()
  106. {
  107.   FILE *lock_fp;
  108.   char lock_fn[100];
  109.   char news_dir[100];
  110.   int ret;
  111.  
  112.   sprintf(news_dir,"%s",NEWS_DIR);
  113.   sprintf(lock_fn,"%s/%s.lock",news_dir,NGDB_FILE);
  114.   if ((lock_fp=fopen(lock_fn,"r"))!=NULL) {
  115.     ret=0;
  116.     fclose(lock_fp);
  117.   } else {
  118.     ret=1;
  119.   }
  120.   return(ret);
  121. }   /* check_news_lock */
  122.  
  123. void lock_news()
  124. {
  125.   FILE *lock_fp;
  126.   char news_dir[100],lock_fn[100];
  127.  
  128.   sprintf(news_dir,"%s",NEWS_DIR);
  129.   sprintf(lock_fn,"%s/%s.lock",news_dir,NGDB_FILE);
  130.   if ((lock_fp=fopen(lock_fn,"w"))!=NULL)
  131.     {
  132.       fprintf(lock_fp,"locked\n");
  133.       fclose(lock_fp);
  134.     }
  135. }  /* lock_news */
  136.  
  137. void unlock_news()
  138. {
  139.   char news_dir[100],lock_fn[100];
  140.   sprintf(news_dir,"%s",NEWS_DIR);
  141.   sprintf(lock_fn,"%s/%s.lock",news_dir,NGDB_FILE);
  142.   unlink(lock_fn);
  143. }  /* unlock_news */
  144.  
  145. void group_insert(first,temp)
  146. s_group **first,*temp;
  147. {
  148.   s_group *loop;
  149.   
  150.   if (*first==NULL)
  151.     {
  152.       *first=temp;
  153.     }
  154.   else
  155.     {
  156.       for (loop=(*first);loop->next!=NULL;loop=loop->next);
  157.       loop->next=temp;
  158.     }
  159. } /* group_insert */
  160.  
  161. post_news_file(news_file,group_name,subject,id)
  162. char *news_file,*group_name,*subject;
  163. int id;
  164. {
  165.   FILE *in,*out;
  166.   FILE *g_fp;
  167.   char news_dir[100],g_fn[100],g_dir[100],a_fn[100];
  168.   s_group *g_first,*g_temp;
  169.   char g_name_in[100],post_in;
  170.   int first_in,last_in;
  171.   int news_locked;
  172.   char cmd[1000];
  173.   char s_in[100];
  174.   FILE *a_fp;
  175.   char *forward;
  176.  
  177.   g_first=NULL;
  178.  
  179.   sprintf(news_dir,"%s",NEWS_DIR);
  180.   sprintf(g_fn,"%s/%s",news_dir,NGDB_FILE);
  181.   sprintf(g_dir,"%s/%s",news_dir,group_name);
  182.   if (!(news_locked=check_news_lock()))
  183.     {
  184.       sleep(2);
  185.       news_locked=check_news_lock();
  186.     }
  187.   if (news_locked==1)
  188.     {
  189.       lock_news();
  190.       if ((g_fp=fopen(g_fn,"r")) == NULL) {
  191.     printf(
  192.             "\nCould not open file %s for reading; you should check it out\n",
  193.            g_fn);
  194.       } else {
  195. /*while((fscanf(g_fp,"%s %d %d %c",g_name_in,&first_in,&last_in,&post_in))>0)*/
  196.     while ((fgets(s_in,100,g_fp))!=NULL) {
  197.       s_in[strlen(s_in)-1] = '\0';
  198.       sscanf(s_in,"%s %d %d %c",g_name_in,&first_in,&last_in,&post_in);
  199.       g_temp=(s_group *)malloc(sizeof(s_group));
  200.       strcpy(g_temp->name,g_name_in);
  201.       /*      sprintf(*g_temp->name,"%s",g_name_in); */
  202.       g_temp->first=first_in;
  203.       g_temp->last=last_in;
  204.       g_temp->postable=post_in;
  205.       g_temp->next=NULL;
  206.       group_insert(&g_first,g_temp);
  207.     }
  208.     fclose(g_fp);
  209.       }
  210.       g_temp=group_find(g_first,group_name);
  211.       if (g_temp==NULL) {
  212.     fprintf(stderr,"Bad group name: %s\n",group_name);
  213.       } else {
  214.       /* sprintf(a_fn,"%s/%d",g_dir,g_temp->last+1);
  215.       sprintf(cmd,"mv %s %s",news_file,a_fn);
  216.       system(cmd);
  217.       */
  218.     sprintf(a_fn,"%s/%d",g_dir,g_temp->last+1);
  219.     a_fp=fopen(a_fn,"w");
  220.     if (a_fp==NULL) {
  221.       fprintf(stderr,"Error Opening New Article File Pointer\n");
  222.       return(1);
  223.     }
  224.     fprintf(a_fp,"Date: Thon %d\n",world.turn);
  225.     if (id==0) {
  226.       fprintf(a_fp,"From: Update\n");
  227.     } else {
  228.       fprintf(a_fp,"From: %s\n",world.nations[id].name);
  229.       fprintf(a_fp,"Author: %s of %s\n",world.nations[id].leader,
  230.           world.nations[id].name);
  231.     }
  232.     fprintf(a_fp,"Subj: %s\n\n",subject);
  233.     insert(news_file,a_fp);
  234.     if (a_fp != NULL) { fclose(a_fp); }
  235.     unlink(news_file);
  236.     (g_temp->last)++;
  237.       }
  238.       if ( (forward = news_post()) != NULL) {
  239.     sprintf(cmd, "cat %s | %s '%s'", a_fn, MAILER, forward);
  240.     system(cmd);
  241.       }
  242.       g_fp=fopen(g_fn,"w");
  243.       for (g_temp=g_first;g_temp!=NULL;g_temp=g_temp->next) {
  244.     fprintf(g_fp,"%s %d %d %c\n",g_temp->name,g_temp->first,
  245.         g_temp->last,g_temp->postable);
  246.       }
  247.       if (g_fp != NULL) { fclose(g_fp); }
  248.       unlock_news();
  249.     } /* News_locked==1 */
  250. } /* Post_news_file */
  251.