DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T r

⟦068b3b04f⟧ TextFile

    Length: 18128 (0x46d0)
    Types: TextFile
    Names: »read_rc.c«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/read_rc.c« 

TextFile

/**			read_rc.c			**/

/** (C) Copyright 1985, Dave Taylor			**/

/** This file contains programs to allow the user to have a .elmrc file
    in their home directory containing any of the following: 

	fullname= <username string>
	maildir = <directory>
	mailbox = <file>
	editor  = <editor>
	savemail= <savefile>
	calendar= <calendar file name>
	shell   = <shell>
	print   = <print command>
	weedout = <list of headers to weed out>
	prefix  = <copied message prefix string>
	pager   = <command to use for displaying messages>

--
	signature = <.signature file for all outbound mail>
OR:
	localsignature = <.signature file for local mail>
	remotesignature = <.signature file for non-local mail>
--

	bounceback= <hop count threshold, or zero to disable>
	timeout = <seconds for main menu timeout or zero to disable>
	userlevel = <0=amateur, 1=okay, 2 or greater = expert!>

	sortby  = <sent, received, from, size, subject>

	alternatives = <list of addresses that forward to us>

    and/or the logical arguments:
	
	autocopy    [on|off]
	copy        [on|off]	
	resolve     [on|off]
	weed        [on|off]
	noheader    [on|off]
	titles      [on|off]
	editout     [on|off]
	savebyname  [on|off]
	movepage    [on|off]
	pointnew    [on|off]
	hpkeypad    [on|off]
	hpsoftkeys  [on|off]
	alwaysleave [on|off]
	alwaysdel   [on|off]
	arrow	    [on|off]
	menus	    [on|off]
	forms	    [on|off]
	warnings    [on|off]
	names	    [on|off]
	ask	    [on|off]
	keepempty   [on|off]


    Lines starting with '#' are considered comments and are not checked
    any further!

    Modified 10/85 to know about "Environment" variables..
    Modified 12/85 for the 'prefix' option
    Modified  2/86 for the new 3.3 flags
    Modified  8/86 (was I supposed to be keeping this up to date?)
**/

#include <stdio.h>
#include <ctype.h>

#ifdef BSD
#undef tolower
#endif

#include "headers.h"

char *shift_lower(), *strtok(), *getenv(), *strcpy();
void   exit();

#define NOTWEEDOUT	0
#define WEEDOUT		1
#define ALTERNATIVES	2

read_rc_file()
{
	/** this routine does all the actual work of reading in the
	    .rc file... **/

	FILE *file;
	char buffer[SLEN], filename[SLEN];
	char word1[SLEN], word2[SLEN];
	register int  i, errors = 0, last = NOTWEEDOUT, lineno = 0;

	sprintf(filename,"%s/%s", home, elmrcfile);

	default_weedlist();

	alternative_addresses = NULL; 	/* none yet! */

	if ((file = fopen(filename, "r")) == NULL) {
	  dprint0(2,"Warning: User has no \".elmrc\" file (read_rc_file)\n");
	  return;	/* we're done! */
	}

	while (fgets(buffer, SLEN, file) != NULL) {
	  lineno++;
	  no_ret(buffer);	 	/* remove return */
	  if (buffer[0] == '#') { 	/* comment       */
	    last = NOTWEEDOUT;
	    continue;
	  }
	  if (strlen(buffer) < 2) {	/* empty line    */
	    last = NOTWEEDOUT;
	    continue;
	  }

	  breakup(buffer, word1, word2);

	  strcpy(word1, shift_lower(word1));	/* to lower case */

	  if (word2[0] == 0 && (last != WEEDOUT || last != ALTERNATIVES)) {
	    dprint1(2,"Error: Bad .elmrc entry in users file;\n-> \"%s\"\n",
		     buffer);
	    fprintf(stderr, 
		    "Line %d of your \".elmrc\" is badly formed:\n> %s\n",
		    lineno, buffer);
	    errors++;
	    continue;
	  }
	
	  if (equal(word1,"maildir") || equal(word1,"folders")) {
	    expand_env(folders, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "fullname") || equal(word1,"username") ||
		   equal(word1, "name")) {
	    strcpy(full_username, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "prefix")) {
	    for (i=0; i < strlen(word2); i++)
	      prefixchars[i] = (word2[i] == '_' ? ' ' : word2[i]);
	    prefixchars[i] = '\0';
	   
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "shell")) {
	    expand_env(shell, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "sort") || equal(word1, "sortby")) {
	    strcpy(word2, shift_lower(word2));
	    if (equal(word2, "sent"))
	       sortby = SENT_DATE;
	    else if (equal(word2, "received") || equal(word2,"recieved"))
	       sortby = RECEIVED_DATE;
	    else if (equal(word2, "from") || equal(word2, "sender"))
	       sortby = SENDER;
	    else if (equal(word2, "size") || equal(word2, "lines"))
	      sortby = SIZE;
	    else if (equal(word2, "subject"))
	      sortby = SUBJECT;
	    else if (equal(word2, "reverse-sent") || equal(word2,"rev-sent"))
	       sortby = - SENT_DATE;
	    else if (strncmp(word2, "reverse-rec",11) == 0 || 
		     strncmp(word2,"rev-rec",7) == 0)
	       sortby = - RECEIVED_DATE;
	    else if (equal(word2, "reverse-from") || equal(word2, "rev-from")
	          || equal(word2,"reverse-sender")|| equal(word2,"rev-sender"))
	       sortby = - SENDER;
	    else if (equal(word2, "reverse-size") || equal(word2, "rev-size")
	          || equal(word2, "reverse-lines")|| equal(word2,"rev-lines"))
	      sortby = - SIZE;
	    else if (equal(word2, "reverse-subject") || 
		     equal(word2, "rev-subject"))
	      sortby = - SUBJECT;
	    else {
	     if (! errors)
	       printf("Error reading '.elmrc' file;\n");
	     printf("Line %d: Don't know what sort key '%s' specifies!\n", 
		    lineno, word2);
	     errors++;
	     continue;
	   }
	  }
	  else if (equal(word1, "mailbox")) {
	    expand_env(mailbox, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "editor") || equal(word1,"mailedit")) {
	    expand_env(editor, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "savemail") || equal(word1, "saveto")) {
	    expand_env(savefile, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "calendar")) {
	    expand_env(calendar_file, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "print") || equal(word1, "printmail")) {
	    expand_env(printout, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "pager") || equal(word1, "page")) {
	    expand_env(pager, word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "signature")) {
	    if (equal(shift_lower(word2), "on") ||
		equal(shift_lower(word2), "off")) {
	      fprintf(stderr, 
	  "\"signature\" used in obsolete way in .elmrc file - ignored!\n\r");
	      fprintf(stderr,
   "\t(signature should specify the filename to use rather than on/off)\n\r");
	    }
	    else {
	      expand_env(local_signature, word2);
	      strcpy(remote_signature, local_signature);
	      signature = TRUE;
	    }
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "localsignature")) {
	    expand_env(local_signature, word2);
	    signature = TRUE;
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "remotesignature")) {
	    expand_env(remote_signature, word2);
	    signature = TRUE;
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "autocopy")) {
	    auto_copy = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "copy") || equal(word1, "auto_cc")) {
	    auto_cc = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "names")) {
	    names_only = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "resolve")) {
	    resolve_mode = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "weed")) {
	    filter = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "noheader")) {
	    noheader = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "titles")) {
	    title_messages = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "editout")) {
	    edit_outbound = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "savebyname") || equal(word1, "savename")) {
	    save_by_name = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "movepage") || equal(word1, "page") ||
		   equal(word1, "movewhenpaged")) {
	    move_when_paged = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "pointnew") || equal(word1, "pointtonew")) {
	    point_to_new = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "keypad") || equal(word1, "hpkeypad")) {
	    hp_terminal = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "softkeys") || equal(word1, "hpsoftkeys")) {
	    if (hp_softkeys = is_it_on(word2))
	      hp_terminal = TRUE;	/* must be set also! */
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "arrow")) {
	    arrow_cursor = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (strncmp(word1, "form", 4) == 0) {
	    allow_forms = (is_it_on(word2)? MAYBE : NO);
	    last = NOTWEEDOUT;
	  }
	  else if (strncmp(word1, "menu", 4) == 0) {
	    mini_menu = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (strncmp(word1, "warning", 7) == 0) {
	    warnings = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "alwaysleave") || equal(word1, "leave")) {
	    always_leave = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "alwaysdelete") || equal(word1, "delete")) {
	    always_del = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "ask") || equal(word1, "question")) {
	    question_me = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "keep") || equal(word1, "keepempty")) {
	    keep_empty_files = is_it_on(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "bounce") || equal(word1, "bounceback")) {
	    bounceback = atoi(word2);
	    if (bounceback > MAX_HOPS) {
	      fprintf(stderr,
	"Warning: bounceback is set to greater than %d (max-hops) - Ignored.\n",
		       MAX_HOPS);
	      bounceback = 0;
	    }
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "userlevel")) {
	    user_level = atoi(word2);
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "timeout")) {
	    timeout = atoi(word2);
	    if (timeout < 10) {
	      fprintf(stderr,
	   "Warning: timeout is set to less than 10 seconds - Ignored.\n");
	      timeout = 0;
	    }
	    last = NOTWEEDOUT;
	  }
	  else if (equal(word1, "weedout")) {
	    weedout(word2);
	    last = WEEDOUT;
	  }
	  else if (equal(word1, "alternatives")) {
	    alternatives(word2);
	    last = ALTERNATIVES;
	  }
	  else if (last == WEEDOUT)	/* could be multiple line weedout */
	    weedout(buffer);
	  else if (last == ALTERNATIVES)	/* multi-line addresses   */
	    alternatives(buffer);
	  else {
	    fprintf(stderr, 
		   "Line %d is undefined in your \".elmrc\" file:\n> %s\n", 
		   lineno, buffer);
	    errors++;
	  }
	}

	if (debug > 10) 	/** only do this if we REALLY want debug! **/
	  dump_rc_results();

	if (errors) 
	  exit(errors);
}
	
weedout(string)
char *string;
{
	/** This routine is called with a list of headers to weed out.   **/

	char *strptr, *header;
	register int i;

	strptr = string;

	while ((header = strtok(strptr, "\t ,\"'")) != NULL) {
	  if (strlen(header) > 0) {
	    if (weedcount > MAX_IN_WEEDLIST) {
	      fprintf(stderr, "Too many weed headers!  Leaving...\n");
	      exit(1);
	    }
	    if ((weedlist[weedcount] = (char *) pmalloc(strlen(header) + 1)) 
		== NULL) {
	      fprintf(stderr,
		      "Too many weed headers - out of memory!  Leaving...\n");
	      exit(1);
	    }

	    for (i=0; i< strlen(header); i++)
	      if (header[i] == '_') header[i] = ' ';

	    strcpy(weedlist[weedcount], header);
	    weedcount++;
	  }
	  strptr = NULL;
	}
}

alternatives(string)
char *string;
{
	/** This routine is called with a list of alternative addresses
	    that you may receive mail from (forwarded) **/

	char *strptr, *address;
	struct addr_rec *current_record, *previous_record;

	previous_record = alternative_addresses;	/* start 'er up! */
	/* move to the END of the alternative addresses list */

	if (previous_record != NULL)
	  while (previous_record->next != NULL)
	    previous_record = previous_record->next;

	strptr = (char *) string;

	while ((address = strtok(strptr, "\t ,\"'")) != NULL) {
	  if (previous_record == NULL) {
	    previous_record = (struct addr_rec *) pmalloc(sizeof 
		*alternative_addresses);

	    strcpy(previous_record->address, address);
	    previous_record->next = NULL;
	    alternative_addresses = previous_record;
	  }
	  else {
	    current_record = (struct addr_rec *) pmalloc(sizeof 
		*alternative_addresses);
	  
	    strcpy(current_record->address, address);
	    current_record->next = NULL;
	    previous_record->next = current_record;
	    previous_record = current_record;
	  }
	  strptr = (char *) NULL;
	}
}

default_weedlist()
{
	/** Install the default headers to weed out!  Many gracious 
	    thanks to John Lebovitz for this dynamic method of 
	    allocation!
	**/

	static char *default_list[] = { ">From", "In-Reply-To:",
		       "References:", "Newsgroups:", "Received:",
		       "Apparently-To:", "Message-Id:", "Content-Type:",
		       "From", "X-Mailer:", "*end-of-defaults*", NULL
		     };

	for (weedcount = 0; default_list[weedcount] != NULL; weedcount++) {
	  if ((weedlist[weedcount] = (char *)
	      pmalloc(strlen(default_list[weedcount]) + 1)) == NULL) {
	    fprintf(stderr, 
	       "\n\rNot enough memory for default weedlist.  Leaving.\n\r");
	    leave(1);
	  }
	  strcpy(weedlist[weedcount], default_list[weedcount]);
	}
}

int
matches_weedlist(buffer)
char *buffer;
{
	/** returns true iff the first 'n' characters of 'buffer' 
	    match an entry of the weedlist **/
	
	register int i;

	for (i=0;i < weedcount; i++)
	  if (strncmp(buffer, weedlist[i], strlen(weedlist[i])) == 0) 
	    return(1);

	return(0);
}

breakup(buffer, word1, word2)
char *buffer, *word1, *word2;
{
	/** This routine breaks buffer down into word1, word2 where 
	    word1 is alpha characters only, and there is an equal
	    sign delimiting the two...
		alpha = beta
	    For lines with more than one 'rhs', word2 is set to the
	    entire string...
	**/

	register int i;
	
	for (i=0;i<strlen(buffer) && isalpha(buffer[i]); i++)
	  word1[i] = buffer[i];

	word1[i++] = '\0';	/* that's the first word! */

	/** spaces before equal sign? **/

	while (buffer[i] == ' ' || buffer[i] == '\t') i++;

	if (buffer[i] == '=') i++;

	/** spaces after equal sign? **/

	while (buffer[i] == ' ' || buffer[i] == '\t') i++;

	if (i < strlen(buffer))
	  strcpy(word2, (char *) (buffer + i));
	else
	  word2[0] = '\0';
}

expand_env(dest, buffer)
char *dest, *buffer;
{
	/** expand possible metacharacters in buffer and then copy
	    to dest... 
	    This routine knows about "~" being the home directory,
	    and "$xxx" being an environment variable.
	**/

	char  *word, *string, next_word[SLEN];
	
	if (buffer[0] == '/') {
	  dest[0] = '/';
	  dest[1] = '\0';
	}
	else
	  dest[0] = '\0';

	string = (char *) buffer;

	while ((word = strtok(string, "/")) != NULL) {
	  if (word[0] == '$') {
	    next_word[0] = '\0';
	    if (getenv((char *) (word + 1)) != NULL)
	    strcpy(next_word, getenv((char *) (word + 1)));
	    if (strlen(next_word) == 0)
	      leave(fprintf(stderr, 
		    "\n\rCan't expand environment variable '%s'\n\r",
		    word));
	  }
	  else if (word[0] == '~' && word[1] == '\0')
	    strcpy(next_word, home);
	  else
	    strcpy(next_word, word);

	  sprintf(dest, "%s%s%s", dest, 
		 (strlen(dest) > 0 && lastch(dest) != '/' ? "/":""),
		 next_word);

	  string = (char *) NULL;
	}
}

#define on_off(s)	(s == 1? "ON" : "OFF")
dump_rc_results()
{

	register int i;

	fprintf(debugfile, "\n\n\n\n");
	fprintf(debugfile, "folders = %s\n", folders);
	fprintf(debugfile, "mailbox = %s\n", mailbox);
	fprintf(debugfile, "editor = %s\n", editor);
	fprintf(debugfile, "printout = %s\n", printout);
	fprintf(debugfile, "savefile = %s\n", savefile);
	fprintf(debugfile, "calendar_file = %s\n", calendar_file);
	fprintf(debugfile, "prefixchars = %s\n", prefixchars);
	fprintf(debugfile, "shell = %s\n", shell);
	fprintf(debugfile, "pager = %s\n", pager);
	fprintf(debugfile, "\n");
	fprintf(debugfile, "mini_menu = %s\n", on_off(mini_menu));
	fprintf(debugfile, "mbox_specified = %s\n", on_off(mbox_specified));
	fprintf(debugfile, "check_first = %s\n", on_off(check_first));
	fprintf(debugfile, "auto_copy = %s\n", on_off(auto_copy));
	fprintf(debugfile, "filter = %s\n", on_off(filter));
	fprintf(debugfile, "resolve_mode = %s\n", on_off(resolve_mode));
	fprintf(debugfile, "auto_cc = %s\n", on_off(auto_cc));
	fprintf(debugfile, "noheader = %s\n", on_off(noheader));
	fprintf(debugfile, "title_messages = %s\n", on_off(title_messages));
	fprintf(debugfile, "hp_terminal = %s\n", on_off(hp_terminal));
	fprintf(debugfile, "hp_softkeys = %s\n", on_off(hp_softkeys));
	fprintf(debugfile, "save_by_name = %s\n", on_off(save_by_name));
	fprintf(debugfile, "move_when_paged = %s\n", on_off(move_when_paged));
	fprintf(debugfile, "point_to_new = %s\n", on_off(point_to_new));
	fprintf(debugfile, "bounceback = %s\n", on_off(bounceback));
	fprintf(debugfile, "signature = %s\n", on_off(signature));
	fprintf(debugfile, "always_leave = %s\n", on_off(always_leave));
	fprintf(debugfile, "always_del = %s\n", on_off(always_del));
	fprintf(debugfile, "arrow_cursor = %s\n", on_off(arrow_cursor));
	fprintf(debugfile, "names = %s\n", on_off(names_only));
	fprintf(debugfile, "warnings = %s\n", on_off(warnings));
	fprintf(debugfile, "question_me = %s\n", on_off(question_me));
	fprintf(debugfile, "keep_empty_files = %s\n", 
			   on_off(keep_empty_files));

	fprintf(debugfile, "\n** userlevel = %s **\n\n", user_level);

	fprintf(debugfile, "Weeding out the following headers;\n");
	for (i=0; i < weedcount; i++) 
	  fprintf(debugfile, "\t\"%s\"\n", weedlist[i]);
	
	fprintf(debugfile, "\n\n");
}

is_it_on(word)
char *word;
{
	/** Returns TRUE if the specified word is either 'ON', 'YES'
	    or 'TRUE', and FALSE otherwise.   We explicitly translate
	    to lowercase here to ensure that we have the fastest
	    routine possible - we really DON'T want to have this take
	    a long time or our startup will be major pain each time.
	**/

	static char mybuffer[NLEN];
	register int i, j;

	for (i=0, j=0; word[i] != '\0'; i++)
	  mybuffer[j++] = isupper(word[i]) ? tolower(word[i]) : word[i];
	mybuffer[j] = '\0';

	return(  (strncmp(mybuffer, "on",   2) == 0) ||
		 (strncmp(mybuffer, "yes",  3) == 0) ||
		 (strncmp(mybuffer, "true", 4) == 0)
	      );
}