Blame cyrus-deliver-wrapper.c
|
John Dennis |
d0d307 |
/*
|
|
John Dennis |
d0d307 |
* Wrapper for cyrus 'deliver' to allow anyone to run it -
|
|
John Dennis |
d0d307 |
* I hope this is secure! Should be setgid mail.
|
|
John Dennis |
d0d307 |
*/
|
|
John Dennis |
d0d307 |
|
|
John Dennis |
d0d307 |
#include <stdio.h>
|
|
John Dennis |
d0d307 |
#include <unistd.h>
|
|
John Dennis |
d0d307 |
#include <pwd.h>
|
|
John Dennis |
d0d307 |
#include <sys/types.h>
|
|
John Dennis |
d0d307 |
#include <sysexits.h>
|
|
John Dennis |
d0d307 |
|
|
John Dennis |
d0d307 |
#ifndef LIBEXECDIR
|
|
John Dennis |
d0d307 |
#define LIBEXECDIR "/usr/lib/cyrus-imapd"
|
|
John Dennis |
d0d307 |
#endif
|
|
John Dennis |
d0d307 |
|
|
John Dennis |
d0d307 |
int main(int argc, char *argv[])
|
|
John Dennis |
d0d307 |
{
|
|
John Dennis |
d0d307 |
char *const envp[] = { NULL };
|
|
John Dennis |
d0d307 |
struct passwd *ent = getpwuid(getuid());
|
|
John Dennis |
d0d307 |
const char *uname = (ent && ent->pw_name && ent->pw_name[0])
|
|
John Dennis |
d0d307 |
? ent->pw_name : "anonymous";
|
|
John Dennis |
d0d307 |
|
|
John Dennis |
d0d307 |
if (argc != 2) {
|
|
John Dennis |
d0d307 |
fprintf(stderr, "Usage: %s mailbox\n", argv[0]);
|
|
John Dennis |
d0d307 |
return EX_USAGE;
|
|
John Dennis |
d0d307 |
}
|
|
John Dennis |
d0d307 |
|
|
John Dennis |
d0d307 |
execle(LIBEXECDIR"/deliver", "deliver", "-e",
|
|
John Dennis |
d0d307 |
"-a", uname, "-m", argv[1],
|
|
John Dennis |
d0d307 |
NULL, envp);
|
|
John Dennis |
d0d307 |
|
|
John Dennis |
d0d307 |
perror("exec "LIBEXECDIR"/deliver");
|
|
John Dennis |
d0d307 |
return EX_OSERR;
|
|
John Dennis |
d0d307 |
}
|