ftp.nice.ch/pub/next/unix/mail/elm2.4/elm.2.4pl17.s.tar.gz#/utils/listalias.c

This is listalias.c in view mode; [Download] [Up]

static char rcsid[] = "@(#)$Id: listalias.c,v 5.5 1992/11/15 01:24:34 syd Exp $";

/*******************************************************************************
 *  The Elm Mail System  -  $Revision: 5.5 $   $State: Exp $
 *
 * 			Copyright (c) 1988-1992 USENET Community Trust
 * 			Copyright (c) 1986,1987 Dave Taylor
 *******************************************************************************
 * Bug reports, patches, comments, suggestions should be sent to:
 *
 *	Syd Weinstein, Elm Coordinator
 *	elm@DSI.COM			dsinc!elm
 *
 *******************************************************************************
 * $Log: listalias.c,v $
 * Revision 5.5  1992/11/15  01:24:34  syd
 * The situation is that the .elm/aliases file is missing, but
 * .elm/aliases.dir and .elm/aliases.pag exist (isn't serendipity
 * wonderful?).  The ndbz functions tolerate this and just put a NULL
 * pointer in the db structure for the data file FILE pointer.  However,
 * get_one_alias() in listalias and elm doesn't account for the db_open()
 * succeeding but the dbz_basef field being NULL, so it passes the NULL
 * pointer to fread().  Detect null and return 0
 * From: dwolfe@pffft.sps.mot.com (Dave Wolfe)
 *
 * Revision 5.4  1992/11/02  20:49:19  syd
 * Resolve a linking error in listalias when DEBUG is enabled.
 * From cs.utexas.edu!chinacat!chip Sun Nov  1 22:04:02 1992
 *
 * Revision 5.3  1992/10/30  22:13:43  syd
 * Apply same mapin/mapout changes to listalias as were used by
 * alias in elm
 * From: Syd
 *
 * Revision 5.2  1992/10/11  01:10:31  syd
 * Add missing setlocale and catopen (just forgotten)
 * From: Syd
 *
 * Revision 5.1  1992/10/04  00:46:45  syd
 * Initial checkin as of 2.4 Release at PL0
 *
 *
 ******************************************************************************/

/** Program that lists all the available aliases.  This one uses the pipe 
    command, feeding the stuff to egrep then sort, or just sort.

**/

#include "elmutil.h"
#include "s_newalias.h"
#include "sysdefs.h"
#include "ndbz.h"

#ifdef BSD
  FILE *popen();
#endif

/*
 * These are used by the "dbz" routines.
 */
#ifdef DEBUG
int debug = 0;
FILE *debugfile = stderr;
#endif

main(argc, argv)
int argc;
char *argv[];
{
	FILE *fd_pipe, *datafile;
	DBZ *db;
	struct alias_rec alias_entry;
	int count = 0, len;
	char buffer[VERY_LONG_STRING], fd_hash[SLEN], 
	     fd_data[SLEN], *home;

#ifdef I_LOCALE
	setlocale(LC_ALL, "");
#endif

	elm_msg_cat = catopen("elm2.4", 0);

	if (argc > 2) {
	  fprintf(stderr, catgets(elm_msg_cat, NewaliasSet, NewaliasListUsage,
		"Usage: listalias <optional-regular-expression>\n"));
	  exit(1);
	}

	home = getenv("HOME");

	sprintf(fd_data, "%s/%s", home, ALIAS_DATA);

	if (argc > 1)
	  sprintf(buffer, "egrep \"%s\" | sort", argv[1]);
	else
	  sprintf(buffer, "sort");

	if ((fd_pipe = popen(buffer, "w")) == NULL) {
	  if (argc > 1) 
	    fprintf(stderr, catgets(elm_msg_cat, NewaliasSet, NewaliasNoPipe,
		"cannot open pipe to egrep program for expressions!\n"));
	  fd_pipe = stdout;
	}

	do {
	    if ((db = dbz_open(fd_data, O_RDONLY, 0)) == NULL) {
	        fprintf(stderr, catgets(elm_msg_cat, NewaliasSet,
		NewaliasNoOpenData, "Could not open %s data file!\n"),
	count? catgets(elm_msg_cat, NewaliasSet, NewaliasSystem, "system")
	     : catgets(elm_msg_cat, NewaliasSet, NewaliasUser, "user"));
	      goto next_file;
	    }
	
	    /** Otherwise let us continue... **/

	    datafile = db->dbz_basef;
	    while (get_one_alias(db, &alias_entry)) {
		len = alias_entry.length;
		fread(buffer, len > sizeof(buffer) ? sizeof(buffer) : len, 1, datafile);
		alias_entry.alias += (int) buffer;
		alias_entry.name += (int) buffer;
		alias_entry.address += (int) buffer;
		fprintf(fd_pipe, "%-20.20s %s (%s)\n", alias_entry.alias, alias_entry.address, alias_entry.name);
		for (len -= sizeof(buffer); len > 0; len -= sizeof(buffer))
		    fread(buffer, len > sizeof(buffer) ? sizeof(buffer) : len, 1, datafile);
	    }

next_file: strcpy(fd_data, system_data_file);

	} while (++count < 2);

	pclose(fd_pipe);

	exit(0);
}

/* byte-ordering stuff */
#define	MAPIN(o)	((db->dbz_bytesame) ? (of_t) (o) : bytemap((of_t)(o), db->dbz_conf.bytemap, db->dbz_mybmap))
#define	MAPOUT(o)	((db->dbz_bytesame) ? (of_t) (o) : bytemap((of_t)(o), db->dbz_mybmap, db->dbz_conf.bytemap))

static of_t			/* transformed result */
bytemap(ino, map1, map2)
of_t ino;
int *map1;
int *map2;
{
	union oc {
		of_t o;
		char c[SOF];
	};
	union oc in;
	union oc out;
	register int i;

	in.o = ino;
	for (i = 0; i < SOF; i++)
		out.c[map2[i]] = in.c[map1[i]];
	return(out.o);
}

get_one_alias(db, ar)
DBZ *db;
struct alias_rec *ar;
{
/*
 *	Get an alias (name, address, etc.) from the data file
 */

	FILE *data_file = db->dbz_basef;

	if (data_file == NULL)
	    return(0);	/* no alias file, but hash exists, error condition */

	if (fread((char *) ar, sizeof(struct alias_rec), 1, data_file) <= 0)
	    return(0);

	ar->status = (int) MAPIN(ar->status);
	ar->alias = (char *) MAPIN(ar->alias);
	ar->last_name = (char *) MAPIN(ar->last_name);
	ar->name = (char *) MAPIN(ar->name);
	ar->comment = (char *) MAPIN(ar->comment);
	ar->address = (char *) MAPIN(ar->address);
	ar->type = (int) MAPIN(ar->type);
	ar->length = (long) MAPIN(ar->length);

	return(1);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.