summaryrefslogtreecommitdiff
path: root/news/slurp/files/siteexclude.c
diff options
context:
space:
mode:
authorJames Raynard <jraynard@FreeBSD.org>1997-11-13 23:14:58 +0000
committerJames Raynard <jraynard@FreeBSD.org>1997-11-13 23:14:58 +0000
commit450506ee5f9211b882d4c30188f1cb288ce61cfa (patch)
tree9523bca7da6ad5961954c74b376d34caa7e0a430 /news/slurp/files/siteexclude.c
parentUpgrade, 1.03a -> 1.03e (diff)
Add site exclusions patches. Some cleanup.
Notes
Notes: svn path=/head/; revision=8606
Diffstat (limited to 'news/slurp/files/siteexclude.c')
-rw-r--r--news/slurp/files/siteexclude.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/news/slurp/files/siteexclude.c b/news/slurp/files/siteexclude.c
new file mode 100644
index 000000000000..67e4aaa05616
--- /dev/null
+++ b/news/slurp/files/siteexclude.c
@@ -0,0 +1,168 @@
+/* siteexclude.c - check article id for excluded sites
+ *
+ * Copyright (C) 1995 Peter Fox <fox@roestock.demon.co.uk>
+ *
+ * This code may be freely copied in it's entirety, but the
+ * above notice may not be removed or altered without
+ * reference to the author.
+ * Individuals may make changes for their own use, however
+ * any changed copies may not be distributed without
+ * reference to the author.
+ * There isn't any guarantee of usefulness or efficacy for
+ * any particular purpose. Take it as it is.
+ */
+#include <stdio.h>
+#include <string.h>
+#include "syslog.h"
+#include "conf.h"
+
+#ifdef TEST
+#define SITEEXCLUDING
+#endif /*TEST*/
+
+#ifdef SITEEXCLUDING
+typedef struct slist
+{
+ struct slist *next;
+ char *str;
+} SLIST, *SLISTPTR;
+
+#define HASHSIZE 256
+#define HASHFN(x) (((x[1] & 15) << 4)|(x[2] & 15)) /* x is (char *), skip '@' */
+
+#ifdef TEST
+#define SITEFILE "./sites"
+#define DROPFILE "./dropped"
+#define log_msg printf
+#define log_sys printf
+#define debug_flag 1
+#else /*!TEST*/
+extern int debug_flag;
+#ifndef SITEFILE
+#define SITEFILE "/var/lib/news/excludesites"
+#endif /*SITEFILE*/
+#ifndef DROPFILE
+#define DROPFILE "/var/lib/news/droppedarticles"
+#endif /*DROPFILE*/
+#endif /*TEST*/
+
+SLIST hash[HASHSIZE];
+
+static FILE *dropfp = (FILE*)0;
+
+site_init()
+{
+ int i;
+ FILE *fp;
+ char linbuf[BUFSIZ];
+ SLISTPTR ptr;
+ int entries, collisions;
+ entries = 0;
+ collisions = 0;
+ for(i = 0; i < HASHSIZE; i++)
+ {
+ hash[i].next = (SLISTPTR)0;
+ hash[i].str = (char *)0;
+ }
+ if(!(fp = fopen(SITEFILE, "r")))
+ {
+ log_msg("site_init: warning - no site exclude file %s", SITEFILE);
+ return;
+ }
+ if(!(dropfp = fopen(DROPFILE, "a")))
+ {
+ log_msg("site_init: warning - cannot open file %s for append, dropped articles logged instead", DROPFILE);
+ }
+ else
+ fprintf(dropfp, "-----\n");
+ /* File contains lines with complete site names to exclude */
+ /* We add the leading @ and trailing > */
+ linbuf[0] = '@';
+ while(1)
+ {
+ /* Read in a line */
+ (void) fgets(linbuf+1, sizeof (linbuf)-2, fp);
+ if(feof(fp))
+ break;
+ /* If a read error then report it and abort */
+ if (ferror(fp))
+ {
+ log_sys("site_init: error reading %s", SITEFILE);
+ break;
+ }
+ if(linbuf[1])
+ {
+ /* Kill the \n */
+ linbuf[strlen(linbuf)-1] = '>';
+ entries++;
+ ptr = &hash[HASHFN(linbuf)];
+ if(debug_flag)
+ fprintf(stderr, "'%s: %08lx'\n", linbuf, ptr);
+ if(!ptr->str)
+ ptr->str = strdup(linbuf);
+ else
+ {
+ /* Run along to the last in line */
+ while(ptr->next)
+ ptr = ptr->next;
+ ptr->next = (SLISTPTR)malloc(sizeof(SLIST));
+ ptr = ptr->next;
+ ptr->next = (SLISTPTR)0;
+ ptr->str = strdup(linbuf);
+ collisions++;
+ }
+ }
+ }
+ fclose(fp);
+ if(debug_flag)
+ log_msg("site_init: site exclude file %s read: %d entries, %d collisions",
+ SITEFILE, entries, collisions);
+}
+
+site_check(char *site)
+{
+ SLISTPTR ptr;
+ ptr = &hash[HASHFN(site)];
+ if(debug_flag)
+ fprintf(stderr, " '%s: %08lx'", site, ptr);
+ if(!ptr->str)
+ return(0);
+ while(ptr)
+ {
+ if(strcmp(site, ptr->str) == 0)
+ return(1);
+ ptr = ptr->next;
+ }
+ return(0);
+}
+
+site_droparticle(char *id)
+{
+ if(dropfp)
+ fprintf(dropfp, "%s\n", id);
+ else
+ log_msg("Excluded article: %s", id);
+}
+
+site_close()
+{
+ if(dropfp)
+ fclose(dropfp);
+}
+
+#ifdef TEST
+main(int argc, char **argv)
+{
+ site_init();
+ argv++;
+ argc--;
+ while(argc--)
+ {
+ if(site_check(*argv))
+ printf("Found %s\n", *argv);
+ argv++;
+ }
+ return(0);
+}
+#endif /*TEST*/
+#endif /* SITEEXCLUDING */