/*
 * defaults - generate default values for headers.
 */

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <pwd.h>
#include <sys/types.h>
#include "news.h"
#include "config.h"
#include "fgetmfs.h"

/* imports */
extern int optind;
extern char *optarg;
extern FILE *efopen();
extern char *getenv(), *getlogin();
extern char *emalloc();
extern struct passwd *getmypwent();
extern time_t time();

/* exports */
char *progname = "";
int debug;

/* forwards */
char *fullname(), *readline(), *getdomainsuf(), *getuserid(), *getfullname();
char *getorg();

/* privates */
int usggcos;			/* strictly speaking, "BTL RJE format" */
time_t now;
long pid;
char *server = NULL;
char *client = NULL;
size_t ntrimmed = 0;		/* number of chars trimmed off client */

/*
 * main - parse arguments and handle options
 */
main(argc, argv)
int argc;
char *argv[];
{
	int c, errflg = 0;

	if (argc > 0)
		progname = argv[0];
	while ((c = getopt(argc, argv, "dp:t:c:s:u")) != EOF)
		switch (c) {
		case 'd':
			++debug;
			break;
		case 'p':
			pid = atol(optarg);
			break;
		case 't':
			now = atol(optarg);
			break;
		case 'c':
			client = optarg;
			break;
		case 's':
			server = optarg;
			break;
		case 'u':
			usggcos++;
			break;
		default:
			errflg++;
			break;
		}
	if (errflg || optind < argc) {
		(void) fprintf(stderr, "usage: %s [-du] [-p pid] [-t time]\n",
			progname);
		exit(2);
	}

	if (client != NULL && server != NULL)
		trimclient();
	getdefaults();
	exit(0);
}

/*
 - trimclient - null out (in client) common suffix of client and server
 * length of suffix left in ntrimmed
 */
trimclient()
{
	register size_t clen = strlen(client);
	register char *c = client + clen;
	register char *s = server + strlen(server);

	for (; *c == *s && c > client && s > server; c--, s--)
		continue;
	if (*c != *s)
		c++;		/* c -> last identical char */
	else if (c > client && s == server && *(c-1) == '.')
		c--;		/* server name considered to have . on front */
	if (c > client && *(c-1) == '.') {
		/* must not end with . */
		while (*(c-1) == '.' && *c != '\0')
			c++;
	}
	*c = '\0';
	ntrimmed = clen - (c - client);
}

getdefaults()
{
	register char *name, *domainsuf, *org;
	register struct passwd *pwp = getmypwent();

	printvar("defhostname", hostname());
	domainsuf = getdomainsuf();
	printvar("defmailsuf", domainsuf);
	printvar("defuser", getuserid(pwp));
	name = getfullname(pwp);
	printvar("defname", name);
	free(name);
	org = getorg();
	printvar("deforg", org);
	free(org);

	/* compute message-id */
	(void) fputs("defmsgid", stdout);
	(void) putchar('=');
	(void) putchar('\'');

	(void) putchar('<');
	intcode(now == 0? time(&now): now);
	(void) putchar('.');
	intcode((time_t)(pid == 0? getpid(): pid));
	if (client != NULL) {
		(void) putchar('.');
		intcode((time_t)ntrimmed);
		if (*client != '\0') {
			(void) putchar('.');
			(void) fputs(client, stdout);
		}
	}
	(void) fputs(domainsuf, stdout);
	(void) putchar('>');

	(void) putchar('\'');
	(void) putchar('\n');
}

char *							/* malloced */
getdomainsuf()
{
	register char *line;
	register char *s;
#	define	HAS(s, c)	(strchr(s, c) != NULL)

	line = readline(ctlfile("mailname"));
	if (line != NULL) {
		for (s = line; *s != '\0'; s++)
			if (*s == '\t')
				*s = ' ';
		s = line;
		line = str3save((HAS(s, '@')) ? "%" : "@", s, "");
		free(s);
	} else {
		s = hostname();
		line = str3save("@", s, (HAS(s, '.')) ? "" : ".uucp");
	}
	return line;
}

char *						/* static */
getuserid(pwp)
register struct passwd *pwp;
{
	register char *name;

	name = getenv("LOGNAME");
	if (name == NULL)
		name = getenv("USER");
	if (name == NULL)
		name = (pwp == NULL? "nobody": pwp->pw_name);
	return name;
}

char *						/* malloced */
getfullname(pwp)
register struct passwd *pwp;
{
	register char *line, *name;

	name = getenv("NAME");
	if (name != NULL)
		return strsave(name);
	else {
		name = str3save(getenv("HOME"), "/", ".name");
		line = readline(name);
		free(name);
		name = (line != NULL? line: strsave(fullname(pwp, usggcos)));
	}
	return name;
}

char *						/* malloced */
getorg()
{
	register char *line;

	line = getenv("ORGANIZATION");
	if (line != NULL)
		return strsave(line);
	else {
		line = readline(ctlfile("organization"));	/* american */
		if (line == NULL)
			line = readline(ctlfile("organization")); /* english */
		if (line == NULL)
			line = strsave("");
	}
	return line;
}

char *						/* malloced */
readline(file)
char *file;
{
	register FILE *fp = fopen(file, "r");
	register char *line;

	if (fp == NULL)
		return NULL;
	line = fgetms(fp);
	(void) fclose(fp);
	if (line != NULL)
		trim(line);
	return line;
}

printvar(var, value)		/* print var='value' with suitable sh quoting */
register char *var, *value;
{
	(void) fputs(var, stdout);
	(void) putchar('=');
	if (*value != '\0') {
		(void) putchar('\'');
		for (; *value != '\0'; value++)
			if (*value == '\'')
				(void) fputs("'\\''", stdout);
			else
				(void) putchar(*value);
		(void) putchar('\'');
	}
	(void) putchar('\n');
}


syntax highlighted by Code2HTML, v. 0.9.1