summaryrefslogtreecommitdiff
path: root/tools/greylist.c
diff options
context:
space:
mode:
authorJohn Denker <jsd@av8n.com>2012-07-19 17:24:43 -0700
committerJohn Denker <jsd@av8n.com>2012-07-29 15:32:34 -0700
commit84688a05a4430daf8dedf80bce35286aff4f4b1c (patch)
treee29b64875916d1e92426f000b17f6319556d2be6 /tools/greylist.c
parent19fdf737cc5e6b535cd02c280fd788793e4f5f3a (diff)
bare beginnings of a greylisting system
Diffstat (limited to 'tools/greylist.c')
-rw-r--r--tools/greylist.c89
1 files changed, 88 insertions, 1 deletions
diff --git a/tools/greylist.c b/tools/greylist.c
index fa7d701..8adac05 100644
--- a/tools/greylist.c
+++ b/tools/greylist.c
@@ -1,5 +1,92 @@
+#include <stdlib.h> /* for exit(), getenv() */
+#include <iostream>
+#include <string>
+#include <sys/types.h> /* for stat() */
+#include <sys/stat.h> /* for stat() */
+#include <unistd.h> /* for stat() */
+#include <stdio.h> /* for perror */
+#include <errno.h> /* for ENOENT */
+#include <fstream> /* for ofstream() */
+#include <fcntl.h> /* for creat() */
+using namespace std;
-int main(){
+const int sa_good = 0;
+const int bug_bait_grey = 1;
+// qmail_queue and spamc have similar interpretations here:
+const int sa_syserr = 71;
+
+pid_t mypid;
+string progname;
+
+void dump(const string var){
+ char* str = getenv(var.c_str());
+ cerr << progname
+ << "[" << mypid << "] "
+ << var;
+ if (str) cerr << " is set to '" << str << "'" << endl;
+ else cerr << " is not set." << endl;
+}
+
+const string dirname("/var/qmail/greylist");
+
+ // int stat(const char *path, struct stat *buf);
+ // int fstat(int fd, struct stat *buf);
+ // int lstat(const char *path, struct stat *buf);
+
+int main(int argc, char** argv){
+ mypid = getpid();
+ progname = argv[0];
+// dump("TCPREMOTEIP");
+// dump("TCPREMOTEHOST");
+
+ char* ipvar = getenv("TCPREMOTEIP");
+ if (!ipvar) {
+ cerr << progname << ": TCPREMOTEIP not set???" << endl;
+ exit(sa_syserr);
+ }
+ string ipbase = ipvar;
+
+// see if our directory exists:
+ struct stat dirstat;
+ int rslt = stat(dirname.c_str(), &dirstat);
+ if (rslt != 0){
+ if (errno != ENOENT) {
+ cerr << progname << ": stat failed for '"
+ << dirname << "' : ";
+ perror(0);
+ }
+ rslt = mkdir(dirname.c_str(), 0755);
+ if (rslt != 0) {
+ cerr << progname
+ << "uid " << getuid()
+ << ": mkdir failed for '"
+ << dirname << "' : ";
+ perror(0);
+ exit(sa_syserr);
+ }
+ }
+
+ string ipname = dirname + "/" + ipbase;
+ struct stat ipstat;
+ rslt = stat(ipname.c_str(), &ipstat);
+ if (rslt != 0){
+ if (errno != ENOENT) {
+ cerr << progname << ": stat failed for '"
+ << ipname << "' : ";
+ perror(0);
+ }
+ ofstream foo;
+ int fd = creat(ipname.c_str(), 0644);
+ if (fd < 0){
+ cerr << progname << ": create failed for '"
+ << ipname << "' : ";
+ perror(0);
+ }
+ close(fd);
+ return(bug_bait_grey);
+ } else {
+ cerr << "file exists: " << ipname << endl;
+ }
return 0;
}