/*******************************************************************************
 * Module: spamcheck
 * Author: Johannes Buchner
 * Use:    calls spamassessin and returns exit codes compatible to bogofilter
 * Date:   2008-01-31
 *********/

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>

#define PROGNAME "spamassassin"
#define PROGARG1 "-e"

char * progname; 

void bailout(char * msg){
	fprintf(stderr, "%s: %s: %s\n", progname, msg, strerror(errno));
	exit(-1);
}

void usage(){
	fprintf(stderr, "SYNAPSIS for %s:\n\n"
	"\t%s <filename>\t\tcalls %s, %s <filename>\n\n"
	"Return value: 0 on non-spam, 5 on spam, 2 else. -1 on error.\n"
	"Author: Johannes Buchner, License: LGPL, no warranty.\n"
	, progname, progname, PROGNAME, PROGARG1);
	exit(-1);
}

int call_spamassassin(char * filename){
	int child;
	int status;
	
	
	if((child = fork()) == 0){
		if(execlp(PROGNAME, PROGARG1, filename, NULL) < 0){
			bailout("child process failure");
		}
	}else if(child == -1){
		bailout("could not fork child process");
	}
	do {
		if (waitpid(child, &status, 0) == -1) {
			bailout("waiting for child process failed\n");
		}else{
			if (WIFEXITED(status))
				return WEXITSTATUS(status);
			if (WIFSIGNALED(status)) {
				fprintf(stderr, "%s: child process got killed. Sad. \n", 
					progname);
				exit(-1);
			}
		}
	} while (!WIFEXITED(status) && !WIFSIGNALED(status));
	exit(-1);
}

int main(int argc, char ** argv){
	int ret;
	
	progname = argv[0];
	
	if(argc!=2)
		usage();
	
	ret = call_spamassassin(argv[1]);
	switch(ret){
		case 0: 
			return 1;
		case 5:
			return 0;
	}
	return 2;
}

