252u3129@fergvax.unl.edu (Mike Gleason) (10/29/90)
I got several requests from folks wanting the .signature randomizer source, so here it is. Comments, bug reports welcome. #!/bin/sh # to extract, remove the header and type "sh filename" if `test ! -d ./SigRnd` then mkdir ./SigRnd echo "mkdir ./SigRnd" fi if `test ! -s ./SigRnd/makefile` then echo "writing ./SigRnd/makefile" cat > ./SigRnd/makefile << '\End\Of\Shar\' all: cc -O sigrnd.c -o sigrnd gcc: gcc -O sigrnd.c -o sigrnd # if you can, compile with gcc; the executable will be about 10% smaller. \End\Of\Shar\ else echo "will not over write ./SigRnd/makefile" fi if `test ! -s ./SigRnd/sigrnd.1` then echo "writing ./SigRnd/sigrnd.1" cat > ./SigRnd/sigrnd.1 << '\End\Of\Shar\' .TH SIGRND 1 "25 Oct 1990" .SH NAME sigrnd \- select a .signature file at random .SH SYNOPSIS .B sigrnd home_directory signature_subdir/prefix [ \-v ] .SH DESCRIPTION .LP A .signature file is used by news readers, so that when you write a message, the .signature file is appended to your message. The .signature file is used primarily to display your name and email address, but often it contains quotes, disclaimers, and anecdotes. Sigrnd picks a file at random from a group of files, so you have a different .signature each time you read news. .SH PARAMETERS .LP Sigrnd needs to know where to put your randomized .signature file, and also where the group of files that you want to pick the .signature from is. For the first parameter simply pass the pathname to your home directory. The second parameter is a bit tricky. First you must name all the files that you want to randomize to begin with the same prefix. Let's say you have made three signatures and they are in a subdirectory called "misc." Since all the files must begin with the same prefix, you choose something logical for a prefix, "sig." Sigrnd looks in the "misc" subdirectory for files beginning with "sig". In addition to the requirement that your files must begin with a prefix, they must also end with a digit from 0-9 (In other words, you can have up to ten signatures). So, you should name your files "sig0", "sig1", and "sig2". Now to specify the second parameter, you would pass "misc/sig" since they reside in the "misc" directory and they all begin with "sig." Lastly, if you pass \-v as the third parameter, sigrnd will tell you how many signatures it found, and which one it picked. .SH EXAMPLES .ta 2.0i .nf sigrnd /usr/myaccount mysubdir/sigprefix -v sigrnd $HOME junk/sig sigrnd ~ junk/.sig -v sigrnd $HOME .sig .fi .SH TIPS .LP Define an alias in your .login file that will call sigrnd before your news reader; that way a new one will be picked each time you read news (i.e. alias r 'sigrnd $HOME junk/sig; rn'). Or, if you are not running csh, call sigrnd from your .profile. .SH CREDITS .LP Version 1.0 25 Oct 90 Mike Gleason of NCEMRSoft, current email address: 252u3129@fergvax.unl.edu .SH SEE ALSO .LP rn(1), nn(1) \End\Of\Shar\ else echo "will not over write ./SigRnd/sigrnd.1" fi if `test ! -s ./SigRnd/sigrnd.c` then echo "writing ./SigRnd/sigrnd.c" cat > ./SigRnd/sigrnd.c << '\End\Of\Shar\' /* .signatureRandomizer (sigrnd) v1.0 10-22-90 Mike Gleason 252u3129@fergvax.unl.edu NCEMRSoft Public Domain. Revise and repost as you wish. */ #define VERSION "1.0" #define AUTHOR "Mike Gleason of NCEMRSoft" /* what's a .signature file? when you write messages to post on usenet, (readnews, rn, nn...) if the mailer finds a file called ".signature" in your home directory, it will append that file to your messages. that is a good place to put your name and email address, along with other stuff like quotes, disclaimers, etc. */ /* how to install: 1. 'make' me. If you have gcc, compile it with that by typing 'make gcc', otherwise use cc and just type 'make'. 2. stick the compiled executable in a place where unix can find it. 3. make all the signature files you want to randomize (up to 10) and name them with the same prefix. (i.e. let's say you pick "sig" as your prefix. then make each random signature file start with "sig", and then tack on a digit after it, like "sig0", "sig1", "sig2", etc., up to "sig9". you don't need to have all 10 files, so if you only had 3 files to randomize you would just have "sig0", "sig1", and "sig2". 4. the program needs to know atleast 2 (atmost 3) things: a. what your home directory is (ie "/usr/myaccount"); b. and what directory to look in to find the files to randomize AND the prefix that each random sig file has. for this parameter you might pass "sig_dir/sig", and have your files called "sig0", "sig1", "sig2", etc; or, if you want to put your files right in your home directory rather than a sub directory, you could just pass "sig". c. an optional third parameter, which i will call verbose mode. if you pass "-v" as the THIRD param, the program will tell you how many signature files it found, AND which signature file it picked to be your ".signature" file. so, in summary, you might run the program like this: sigrnd /usr/myaccount tmp/sig_dir/sig -v (or) sigrnd ~ tmp/sig -v (or) sigrnd $HOME tmp/sig -v (or) sigrnd ~ sig 5. it would be a pain in the #$@ to type that everytime you wanted to randomize your signatures, so i recommend that you make an alias for your news reader to call sigrnd before it actually reads the news, like: alias r 'sigrnd /usr/myaccount tmp/sig_dir/sig; rn' and put that in your .login file, *OR* just call sigrnd from your .login (or .profile) file (I prefer the first method because the login process takes awhile on my machine). */ #include <stdio.h> #include <time.h> main(argc, argv) int argc; char *argv[]; { int verbose = argc>3 ? 1 : 0; /* if we want info to print when run */ FILE *in, *out; /* input and output file pointers. */ char filename[80]; /* to open the sig files with */ char signame[80]; /* to open .signature with */ char digit = 0; /* we'll substitute the last char of a filename with a digit (0-9) */ int i, howmany = 0; /* misc. counter; number of sigs found */ int lastchar; /* we will replace the last char with the 'digit' char. */ if (argc < 3 || argc > 4) { fprintf(stderr, "\n%s home_directory signature_prefix [-v]\nVersion %s by %s \n\n", argv[0], VERSION, AUTHOR); exit(1); } strcpy(filename, argv[1]); strcat(filename, "/"); strcat(filename, argv[2]); /* the previous makes home/local/sigPrefix */ strcat(filename, "x"); /* we can replace the 'x' character with a digit from 0-9 */ lastchar = strlen(filename) - 1; /* keep track of the 'x' char */ /* count how many sig files there should be. If we get 'howmany' files in the next routine, we'll assume the user has sig0, sig1, etc, all the way to sigHowmany. Even if the user wants to be a jerk and not have a contigious list of files, the pick routine will work since it found atleast one sig file. If we don't find any, put up the little help text. */ for (i=9; i>=0; i--) { filename[lastchar] = '0' + (char) i; if ((in = fopen(filename, "r")) != NULL) { howmany = i + 1; break; } } if (howmany == 0) { fprintf(stderr, "%s: I couldn't find a list of .signatures to randomize.\n", argv[0]); exit(1); } fclose(in); if (verbose) printf("%s: %d .signatures found.\n", argv[0], howmany); /* pick a new signature file each time */ srand( (unsigned int) time(NULL) ); /* pick a sig file, and see if we can open it. */ for (;;) { digit = rand() % howmany; filename[lastchar] = '0' + (char) digit; in = fopen(filename, "r"); if (in) break; } if (verbose) printf("%s: selected number %d.\n", argv[0], digit); strcpy(signame, argv[1]); strcat(signame, "/.signature"); /* get full path */ out = fopen(signame, "w"); if (!out) { fprintf(stderr, "%s: error creating new signature file.\n", argv[0]); exit(1); } while ((i = getc(in)) != EOF) putc(i, out); /* copy the sig file into the .signature file */ fclose(in); fclose(out); } /* That's all folks! */ \End\Of\Shar\ else echo "will not over write ./SigRnd/sigrnd.c" fi echo "Finished archive 1 of 1" exit mike gleason "How I've waited for you to come 252u3129@fergvax.unl.edu I've been here all alone Now that you've arrived, please stay awhile And I promise not to keep you long... I'll keep you forever" -- Slayer