home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 11287 < prev    next >
Text File  |  1994-09-29  |  11KB  |  324 lines

  1. Newsgroups: alt.sources
  2. Path: wupost!psuvax1!news.pop.psu.edu!news.cac.psu.edu!howland.reston.ans.net!news.sprintlink.net!sunserver.insinc.net!cuugnet!barkers
  3. From: barkers@cuug.ab.ca (Scott Barker)
  4. Subject: Automatic Sig changer - wow an update already :)
  5. Sender: usenet@cuug.ab.ca
  6. Message-ID: <Cwvs0H.EM1@cuug.ab.ca>
  7. Date: Thu, 29 Sep 1994 07:41:04 GMT
  8. Organization: Calgary UNIX User's Group
  9. X-Newsreader: TIN [version 1.2 PL0]
  10. Lines: 312
  11.  
  12. Well, here's a sort-of, semi-official, virtually-bug-free,
  13. needs-lots-of-neat-features-added version of my Sig changer. It's attached as
  14. a self-extracting sh archive on the end of this post. Hope you get long hours
  15. of mindless enjoyment out of it :)
  16.  
  17. From the README:
  18.  
  19. In the past, I've seen many different sig changers - but none really suited my
  20. needs. So I wrote a _very_ short, _very_ simple one which did.
  21.  
  22. The program spits out a signature, with a quote from a list of quotes in
  23. $HOME/.Quotes, on every read from the named pipe $HOME/.Sig
  24.  
  25. The quotes in .Quotes are separated by a single '%' on a line by itself (no
  26. white space on the separating line, either).
  27.  
  28. The most sophisticated part of the program is that it keeps track of the quote
  29. it is on in a file called .Quotenum (I use the quotes sequentially from the
  30. quote file - if you want to change how the quote is picked, it shouldn't be
  31. hard). So when you kill and restart Sig, it remembers where it left off. Also,
  32. if you want to continue with a particular quote, just edit .Quotenum to
  33. reflect its position in .Quotes
  34.  
  35. Another nice thing about it (at least under Linux), is that the pipe
  36. implementation causes Sig to block when opening the pipe to write until
  37. another process opens the pipe to read. Thus, Sig puts essentially zero load
  38. on the system.
  39.  
  40. --- cut here ---
  41. #!/bin/sh
  42. echo x - COPYRIGHT
  43. sed 's/^X//' >COPYRIGHT <<'*-*-END-of-COPYRIGHT-*-*'
  44. XI wrote it, it's mine. Don't take credit for it, and I'll be happy :)
  45. X
  46. XSeriously, just follow the usual GNU Public License stuff - add to it, change
  47. Xit, re-write it - just make sure that you always provide source and don't
  48. Xlimit re-distribution. A little note saying where it originally came from
  49. Xwould be nice, too.
  50. X
  51. XScott Barker
  52. Xbarkers@cuug.ab.ca
  53. Xscott@galileo.cuug.ab.ca
  54. *-*-END-of-COPYRIGHT-*-*
  55. echo x - README
  56. sed 's/^X//' >README <<'*-*-END-of-README-*-*'
  57. XIn the past, I've seen many different sig changers - but none really suited my
  58. Xneeds. So I wrote a _very_ short, _very_ simple one which did.
  59. X
  60. XThe program spits out a signature, with a quote from a list of quotes in
  61. X$HOME/.Quotes, on every read from the named pipe $HOME/.Sig
  62. X
  63. XThe quotes in .Quotes are separated by a single '%' on a line by itself (no
  64. Xwhite space on the separating line, either).
  65. X
  66. XThe most sophisticated part of the program is that it keeps track of the quote
  67. Xit is on in a file called .Quotenum (I use the quotes sequentially from the
  68. Xquote file - if you want to change how the quote is picked, it shouldn't be
  69. Xhard). So when you kill and restart Sig, it remembers where it left off. Also,
  70. Xif you want to continue with a particular quote, just edit .Quotenum to
  71. Xreflect its position in .Quotes
  72. X
  73. XAnother nice thing about it (at least under Linux), is that the pipe
  74. Ximplementation causes Sig to block when opening the pipe to write until
  75. Xanother process opens the pipe to read. Thus, Sig puts essentially zero load
  76. Xon the system.
  77. X
  78. XSo how do you use it?
  79. X
  80. XFirst, edit Sig.h for any compile time parameters you want to change. I think
  81. XSig.h is pretty straightforward and the comments should give you all the help
  82. Xyou need.
  83. X
  84. XThen compile it: 'cc Sig.c -o Sig'
  85. X
  86. XTo use it, put something like this in your .login:
  87. X
  88. Xif (`who | grep -c $USER` == 1) then
  89. X   Sigstart
  90. Xendif
  91. X
  92. Xand something like this in your .logout:
  93. X
  94. Xif (`who | grep -c $USER` == 1) then
  95. X   Sigkill
  96. Xendif
  97. X
  98. XMake sure that Sigstart, Sigkill and Sig are all in your path and are
  99. Xexecutable.
  100. X
  101. XThe if..then..endif just makes sure that concurrent login sessions don't cause
  102. Xmultiple instances of Sig to start, and makes sure that only the _last_ logout
  103. Xfrom concurrent sessions kills Sig. This assumes, of course, that you only
  104. Xwant to run it when you're logged in. I really can't see any reason why you'd
  105. Xwant to run it when you're not logged in. Unless for some reason you maybe
  106. Xwant others to read your quotes as well.
  107. X
  108. XSigstart and Sigkill are just simple shell scripts. Sigstart kills all
  109. Xinstances of Sig which are currently running in the user's process space,
  110. Xchecks that .Sig exists, and is a pipe, and then runs Sig in the background
  111. Xand exits. Sigkill just kills all instances of Sig currently running in the
  112. Xuser's process space. Both shell scripts use 'ps' to determine the pid's of
  113. Xthe currently running instances of Sig, so you should probably check to make
  114. Xsure that they're doing what they're supposed to (different vendors seem to
  115. Xenjoy implementing ps with their own unique output style).
  116. X
  117. XIf you change .Quotes or .Quotenum, you must rerun Sigstart so that Sig can
  118. Xrecalibrate itself.
  119. X
  120. XQuestions? Comments? Dirty jokes? Send them to:
  121. XScott Barker
  122. Xbarkers@cuug.ab.ca
  123. Xscott@galileo.cuug.ab.ca
  124. *-*-END-of-README-*-*
  125. echo x - Sig.c
  126. sed 's/^X//' >Sig.c <<'*-*-END-of-Sig.c-*-*'
  127. X/* Sig.c: the automatic signature generator 
  128. X * Copyright (C) 1994 by Scott Barker
  129. X * First revision: September 28, 1994
  130. X */
  131. X
  132. X#include <stdio.h>
  133. X#include <errno.h>
  134. X#include <unistd.h>
  135. X#include "Sig.h"
  136. X
  137. X#define LINELEN 80 /* arbitrary length - any number would do */
  138. X
  139. Xchar *progname; /* so every functions knows it's master :) */
  140. X
  141. Xvoid main(int argc, char *argv[])
  142. X{
  143. X  FILE *fp_quotes, *fp_pipe, *fp_quotenum; /* various file pointers */
  144. X  char *quotefile, *quotenumfile, *sigpipe; /* various file names */
  145. X  char *delim, *msg; /* delimiter and constant message strings */
  146. X  char linebuf[LINELEN]; /* temp storage for file reads */
  147. X  long int quotepos[MAXQUOTES]; /* array holding the file offset to each
  148. X                                   quote as returned by ftell () */
  149. X  char *got_line; /* check mechanism for valid line reads */
  150. X  int quotenum;  /* current quote */
  151. X  int quotecount; /* total quote count */
  152. X
  153. X/* assign all the various string arguments - be nice if they could be
  154. X   controlled from the command line, but I'm lazy */
  155. X
  156. X  progname = argv[0];
  157. X
  158. X  quotefile = QUOTEFILE;
  159. X  quotenumfile = QUOTENUMFILE;
  160. X  sigpipe = SIGPIPE;
  161. X  delim = DELIM;
  162. X  msg = MSG;
  163. X
  164. X/* open the quote file and scan through it, getting the offset to the start of
  165. X   each quote. Mediocre error checking for file access failures. */
  166. X
  167. X  if ((fp_quotes = fopen(quotefile,"r")) == NULL)
  168. X    exitSig("Could not open", quotefile, errno);
  169. X
  170. X  quotepos[quotecount=0] = 0;
  171. X  while (quotecount < MAXQUOTES-1 && !feof(fp_quotes)) {
  172. X    while ((got_line = fgets(linebuf,LINELEN,fp_quotes))
  173. X           && strcmp(linebuf,delim)) {}
  174. X    if (got_line) quotepos[++quotecount] = ftell(fp_quotes);
  175. X  }
  176. X
  177. X  if (!got_line && !feof(fp_quotes))
  178. X    exitSig("Error scanning", quotefile, errno);
  179. X
  180. X  fclose(fp_quotes);
  181. X
  182. X/* get where we left off when Sig was last killed, or start from ground zero
  183. X   if no record of last position */
  184. X
  185. X  quotenum = 0;
  186. X
  187. X  if ((fp_quotenum = fopen(quotenumfile,"r")) != NULL) {
  188. X    fscanf(fp_quotenum,"%d","enum);
  189. X    fclose(fp_quotenum);
  190. X  }
  191. X
  192. X/* main loop -
  193. X      endlessly spit out the constant message, and the next quote to each
  194. X      process which tries to read the pipe. Again, some mediocre error
  195. X      checking for file errors. */
  196. X  
  197. X  while(1) {
  198. X/* open pipe for writing */
  199. X    if ((fp_pipe = fopen(sigpipe,"w")) == NULL)
  200. X      exitSig("Error opening pipe", sigpipe, errno);
  201. X
  202. X/* dump out the constant message when a read finally comes along */
  203. X    if (fprintf(fp_pipe,"%s",msg) == 0)
  204. X      exitSig("Error writing to pipe", sigpipe, errno);
  205. X
  206. X/* open up the quote file */
  207. X    if ((fp_quotes = fopen(quotefile,"r")) == NULL)
  208. X      exitSig("Could not open", quotefile, errno);
  209. X
  210. X/* seek to next quote */
  211. X    if (fseek(fp_quotes, quotepos[quotenum], SEEK_SET) != 0)
  212. X      exitSig("error seeking", quotefile, errno);
  213. X
  214. X/* spit out next quote to process reading pipe */
  215. X    while ((got_line = fgets(linebuf,LINELEN,fp_quotes))
  216. X           && strcmp(linebuf,delim))
  217. X      if (fprintf(fp_pipe,"%s",linebuf) == 0)
  218. X        exitSig("Error writing to pipe", sigpipe, errno);
  219. X
  220. X    if (!got_line && !feof(fp_quotes))
  221. X      exitSig("Error reading", quotefile, errno);
  222. X
  223. X    fclose(fp_quotes);
  224. X    fclose(fp_pipe);
  225. X
  226. X/* update the current quote number so we can pick up where we left off if 
  227. X   Sig gets killed */
  228. X    if (++quotenum > quotecount) quotenum = 0;
  229. X    if ((fp_quotenum = fopen(quotenumfile,"w")) == NULL)
  230. X      exitSig("Could not open", sigpipe, errno);
  231. X
  232. X    if (fprintf(fp_quotenum,"%d\n",quotenum) == 0)
  233. X      exitSig("Error writing to", quotenumfile, errno);
  234. X
  235. X    fclose(fp_quotenum);
  236. X
  237. X/* a little delay to make sure that the reading process has noticed that the
  238. X   pipe has been closed and stops trying to get more data. I'm not sure this
  239. X   is needed, but it can't hurt. */
  240. X    sleep(2);
  241. X  }
  242. X}
  243. X
  244. X/* error handling function to make all the code above a little prettier :) */
  245. X
  246. XexitSig(char *msg1, char *msg2, int error)
  247. X{
  248. X  fprintf(stderr,"%s: %s %s\n", progname, msg1, msg2);
  249. X  exit(error);
  250. X}
  251. X  
  252. *-*-END-of-Sig.c-*-*
  253. echo x - Sig.h
  254. sed 's/^X//' >Sig.h <<'*-*-END-of-Sig.h-*-*'
  255. X/* Sig.h: user adjusted compile time parameters
  256. X * Copyright (C) 1994 by Scott Barker
  257. X * /
  258. X
  259. X/* Make this reflect whatever constant part of your signature you want to
  260. X * show up with every quote.
  261. X */
  262. X#define MSG "Scott Barker\nscott@galileo.cuug.ab.ca\n\n"
  263. X
  264. X/* The maximum number of quotes scanned from .Quotes
  265. X * It would have been nicer to not have a limit, but assigning a static array
  266. X * is easy - and I'm lazy.
  267. X */
  268. X#define MAXQUOTES 4000
  269. X
  270. X/* Locations of the various files - change them if you want.
  271. X * Make sure that the pipe is used by all of your mailers and newsreaders,
  272. X * though.
  273. X */
  274. X#define SIGPIPE ".Sig"
  275. X#define QUOTEFILE ".Quotes"
  276. X#define QUOTENUMFILE ".Quotenum"
  277. X
  278. X/* The delimiting line to search for between quotes when initially scanning
  279. X * the quote file.
  280. X */
  281. X#define DELIM "%\n"
  282. X
  283. *-*-END-of-Sig.h-*-*
  284. echo x - Sigkill
  285. sed 's/^X//' >Sigkill <<'*-*-END-of-Sigkill-*-*'
  286. Xkill -9 `ps -hcx | grep -w 'Sig' | awk '{ print $1 }'`
  287. *-*-END-of-Sigkill-*-*
  288. echo x - Sigstart
  289. sed 's/^X//' >Sigstart <<'*-*-END-of-Sigstart-*-*'
  290. X#!/bin/csh
  291. X
  292. Xkill -9 `ps -hcx | grep -w 'Sig' | awk '{ print $1 }'`
  293. X
  294. Xcd $HOME
  295. X
  296. Xif (! -e .Sig ) then
  297. X   mknod .Sig p
  298. Xendif
  299. Xif ( ! -p .Sig ) then
  300. X   echo "startSig: .Sig does not exist or is not a pipe!"
  301. X   exit 1
  302. Xendif
  303. XSig &
  304. *-*-END-of-Sigstart-*-*
  305. echo x - quotes.ex
  306. sed 's/^X//' >quotes.ex <<'*-*-END-of-quotes.ex-*-*'
  307. X"What you have is God's gift to you. What you do with what you have is your
  308. X   gift to God."
  309. X   - (?)
  310. X%
  311. X"[End of diatribe.  We now return you to your regularly scheduled
  312. X   programming...]"
  313. X   - Larry Wall in Configure from the perl distribution
  314. X%
  315. X"Children are a great comfort in your old age - and they help you reach it
  316. X   faster, too."
  317. X   - Lionel Kauffman
  318. *-*-END-of-quotes.ex-*-*
  319. exit
  320.  
  321. --
  322. Scott Barker
  323. barkers@cuug.ab.ca
  324.