|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 5249 (0x1481)
Types: TextFile
Names: »ckmf.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Chans/822-local/ckmf.c«
/* chkmf.c: check local delivery file stuff */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/822-local/RCS/ckmf.c,v 5.0 90/09/20 15:44:48 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Chans/822-local/RCS/ckmf.c,v 5.0 90/09/20 15:44:48 pp Exp Locker: pp $
*
* $Log: ckmf.c,v $
* Revision 5.0 90/09/20 15:44:48 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include <varargs.h>
#include "expand.h"
#include "retcode.h"
#include <sys/stat.h>
#include <pwd.h>
#define PROTMODE (0022)
#define MAXVARS 100
Expand variables[MAXVARS];
int nvars;
static int fakeuserid;
static int change_user = 0;
char *myname;
extern int debug, yydebug;
void adios (), advise ();
main (argc, argv)
int argc;
char **argv;
{
extern char *optarg;
extern int optind;
extern FILE *yyin;
int opt;
int n;
char msg_size[20];
struct stat st;
myname = argv[0];
while((opt = getopt(argc, argv, "du:i:")) != EOF)
switch (opt) {
case 'd':
yydebug = debug = 1;
break;
case 'u':
{
struct passwd *pwd;
if ((pwd = getpwnam (optarg)) == NULL) {
fprintf (stderr,
"Unknown user name %s",
optarg);
exit (1);
}
fakeuserid = pwd -> pw_uid;
change_user = 1;
}
break;
case 'i':
fakeuserid = atoi(optarg);
change_user = 1;
break;
default:
fprintf (stderr, "Usage: %s [-d] mailfilter\n",
myname);
break;
}
argc -= optind;
argv += optind;
if (change_user)
do_the_change (fakeuserid);
if (argc != 1)
adios (NULLCP, "Usage: %s [-d] mailfilter", myname);
if ((yyin = fopen (argv[0], "r")) == NULL)
adios (argv[0], "Can't open file");
if (fstat (fileno (yyin), &st) == NOTOK)
adios (argv[0], "Can't fstat file");
if (st.st_mode & PROTMODE) {
fprintf (stderr, "File %s has wrong mode (%o)\n",
argv[0], st.st_mode & 0777);
fprintf (stderr,
"Should not have group or general write permission\n");
}
initialise ();
yyparse();
if (fstat (0, &st) == -1)
(void) strcpy (msg_size, "???");
else (void) sprintf (msg_size, "%d", st.st_size);
n = 0;
variables[n].macro = strdup("size");
variables[n].expansion = strdup (msg_size);
create_var (&variables[n]);
n++;
variables[n].macro = strdup ("return-path");
variables[n].expansion = strdup ("sender@remote");
create_var (&variables[n]);
n++;
variables[n].macro = strdup ("mailbox");
variables[n].expansion = strdup ("themailbox");
create_var (&variables[n]);
n++;
variables[n].macro = strdup ("recipient");
variables[n].expansion = strdup ("therecipient");
create_var (&variables[n]);
n++;
variables[n].macro = strdup ("userid");
if (getenv ("USER"))
variables[n].expansion = strdup (getenv("USER"));
else {
(void) sprintf (msg_size, "%d", getuid ());
variables[n].expansion = strdup (msg_size);
}
create_var (&variables[n]);
n ++;
(void) sprintf (msg_size, "%d", getgid ());
variables[n].macro = strdup ("groupid");
variables[n].expansion = strdup (msg_size);
create_var (&variables[n]);
n ++;
variables[n].macro = strdup ("channelname");
variables[n].expansion = strdup ("thechannel");
create_var (&variables[n]);
n++;
nvars = parse_hdr (0, variables + 3, MAXVARS - 3) + 3;
switch (run ()) {
case RP_OK:
printf ("Result: delivered OK\n");
break;
case RP_BAD:
printf ("Result: delivery failed (permanently)\n");
break;
case RP_AGN:
printf ("Result: delivered failed (temporarily)\n");
break;
default:
printf ("Result: Dunno!\n");
break;
}
exit (0);
}
do_the_change (id)
int id;
{
int myuid = getuid ();
struct passwd *pwd;
extern char *pplogin;
pwd = getpwnam (pplogin);
if (myuid == 0 ||
(pwd && myuid == pwd -> pw_uid)) {
#ifdef BSD42
if (setreuid (id, id) == NOTOK)
#else
if (setuid (id) == NOTOK)
#endif
adios ("setreuid", "Can't set ids to %d", id);
}
else
adios (NULLCP, "Not running as root or PP");
}
#ifndef lint
static void _advise ();
void adios (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
_exit (1);
}
#else
/* VARARGS */
void adios (what, fmt)
char *what,
*fmt;
{
adios (what, fmt);
}
#endif
#ifndef lint
void advise (va_alist)
va_dcl
{
va_list ap;
va_start (ap);
_advise (ap);
va_end (ap);
}
static void _advise (ap)
va_list ap;
{
char buffer[BUFSIZ];
asprintf (buffer, ap);
(void) fflush (stdout);
fprintf (stderr, "%s: ", myname);
(void) fputs (buffer, stderr);
(void) fputc ('\n', stderr);
(void) fflush (stderr);
}
#else
/* VARARGS */
void advise (what, fmt)
char *what,
*fmt;
{
advise (what, fmt);
}
#endif
putunixfile (str)
char *str;
{
char buf[BUFSIZ];
expand (buf, str, variables);
printf ("append to file (sendmail format) '%s'\n", buf);
return RP_OK;
}
putfile (str)
char *str;
{
char buf[BUFSIZ];
expand (buf, str, variables);
printf ("append to file '%s'\n", buf);
return RP_OK;
}
putpipe (str)
char *str;
{
char buf[BUFSIZ];
install_vars (variables, nvars, MAXVARS);
expand (buf, str, variables);
printf ("pipe into process '%s'\n", buf);
return RP_OK;
}
printit (s)
char *s;
{
fputs (s, stdout);
}