#include /* for exit(), getenv() */ #include #include #include /* for stat() */ #include /* for stat() */ #include /* for stat() */ #include /* for perror */ #include /* for ENOENT */ #include /* for ofstream() */ #include /* for creat() */ using namespace std; 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; }