/* prsvunix.c */

/* This file contains the UNIX-specific parts of the "elvprsv" program. */

#if OSK
# define ELVPRSV
# include "osk.c"
#else
# include <sys/stat.h>
# include <pwd.h>
#endif
#ifndef __STDC__
/* some older systems don't declare this in pwd.h, I guess. */
extern struct passwd *getpwuid();
#endif

/* This variable is used to add extra error messages for mail sent to root */
char *ps;

/* This function returns the login name of the owner of a file */
char *ownername(filename)
	char	*filename;	/* name of a file */
{
	struct stat	st;
	struct passwd	*pw;

	/* stat the file, to get its uid */
	if (stat(filename, &st) < 0)
	{
		ps = "stat() failed";
		return "root";
	}

	/* get the /etc/passwd entry for that user */
	pw = getpwuid(st.st_uid);
	if (!pw)
	{
		ps = "uid not found in password file";
		return "root";
	}

	/* return the user's name */
	return pw->pw_name;
}


/* This function sends a mail message to a given user, saying that a file
 * has been preserved.
 */
void mail(user, file, when, tmp)
	char	*user;	/* name of user who should receive the mail */
	char	*file;	/* name of original text file that was preserved */
	char	*when;	/* description of why the file was preserved */
	char	*tmp;	/* NULL normally; else name of tmp file if user should run elvprsv -R */
{
	char	cmd[80];/* buffer used for constructing a "mail" command */
	FILE	*m;	/* stream used for giving text to the "mail" program */
	char	*base;	/* basename of the file */

	/* separate the directory name from the basename. */
	for (base = file + strlen(file); --base > file && *base != SLASH; )
	{
	}
	if (*base == SLASH)
	{
		*base++ = '\0';
	}

	/* for anonymous buffers, pretend the name was "foo" */
	if (!strcmp(base, "*"))
	{
		base = "foo";
	}

	/* open a pipe to the "mail" program */
#if OSK
	sprintf(cmd, "%s \"-s=%s preserved!\" %s", MAILER, base, user);
#else /* ANY_UNIX */
	sprintf(cmd, "%s -s Graceland %s", MAILER, user);
	switch (fork())
	{
	  case -1: /* error */
		return;

	  case 0: /* child */
		/* surrender any special privileges */
		setuid(getuid());
		break; /* continue with the rest of this function */

	  default: /* parent */
		wait(NULL);
		return;
	}
#endif
	m = popen(cmd, "w");
	if (!m)
	{
		perror(cmd);
		/* Can't send mail!  Hope the user figures it out. */
		return;
	}

	/* Tell the user that the file was preserved */
	fprintf(m, "A version of your file \"%s%c%s\"\n", file, SLASH, base);
	fprintf(m, "was preserved when %s.\n", when);
	fprintf(m, "To recover this file, do the following:\n");
	fprintf(m, "\n");
#if OSK
	fprintf(m, "     chd %s\n", file);
#else /* ANY_UNIX */
	fprintf(m, "     cd %s\n", file);
#endif
	if (tmp)
	{
		fprintf(m, "     elvprsv %s\n", tmp);
	}
	else
	{
		fprintf(m, "     elvrec %s\n", base);
	}
	fprintf(m, "\n");
	fprintf(m, "With fond wishes for a speedy recovery,\n");
	fprintf(m, "                                    Elvis\n");
	if (ps)
	{
		fprintf(m, "\nP.S. %s\n", ps);
		ps = (char *)0;
	}

	/* close the stream */
	pclose(m);
#if ANY_UNIX
	exit(0);
#endif
}
