Date: Sun, 13 Sep 1998 09:51:13 -0500 (CDT) From: Conrad Sabatier <conrads@neosoft.com> To: freebsd-stable@FreeBSD.ORG Subject: Awk problem (bug?) Message-ID: <XFMail.980913095113.conrads@neosoft.com>
next in thread | raw e-mail | index | archive | help
If this would be better posted to another list, please let me know, and I'll remail it. Background: FreeBSD 2.2.7-STABLE, cvsup/make world/kernel build done on Aug 28, 1998. I recently decided to try writing an external filtering program for "suck". Here's the mechanism as described in the suck man page: 1. suck will write a 8 byte long string, which rep- resents the length of the header record on stdin of the external program. Then length is in ascii, is left-aligned, and ends in a newline (example: "1234 \n"). 2. suck will then write the header on stdin of the external program. 3. suck will wait for a 2 character response code on stdout. This response code is either "0\n" or "1\n" (NOT BINARY ZERO OR ONE, ASCII ZERO OR ONE). If the return code is zero, suck will download the article, if it is one, suck won't. 4. When there are no more articles, the length written down (for step 1) will be zero (again in ascii "0 \n"). Suck will then wait for the external program to exit before continuing on. The external program can do any clean up it needs, then exit. Note: suck will not continue processing until the external program exits. Unfortunately, my awk script would not communicate properly with suck using the standard /usr/bin/awk. For some reason, the result string my script was writing to stdout was not being read by suck, and both the script and suck would simply hang in a piperd state. So, I installed kawk from the ports collection, and it worked! Here's the script. So far, it just checks the Newsgroups: header against the active file and rejects the article if any group is not found: #!/usr/local/bin/kawk -f BEGIN { active = "/usr/local/news/lib/active" logfile = "/usr/local/news/suck.kill.log" stdin = "/dev/stdin" stdout = "/dev/stdout" } # size of header? /^[0-9]+ *$/ \ { FS = " " if ($1 == "0") { print "===== NO MORE ARTICLES =====" >> logfile exit } headsize = int($1) size = 0 next } # All other header lines { print $0 >> logfile FS = " " size += (length + 1) if ($1 == "Newsgroups:") { NGS = $2 FS = "," n = split ($2, group) FS = " " act_groups = 0 for (i = 1; i <= n; i++) { while (getline <active) { if ($1 == group[i]) { act_groups++ break } } close (active) if (act_groups < i) { break } } } if (size >= headsize) { if (act_groups < n) { print "===== ARTICLE REJECTED =====" >> logfile print "1" >stdout } else { print "===== ARTICLE ACCEPTED =====" >> logfile print "0" >stdout } next } } ---------------------------------- E-Mail: Conrad Sabatier <conrads@neosoft.com> Date: 13-Sep-98 Time: 09:38:11 This message was sent by XFMail ---------------------------------- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.980913095113.conrads>