#include #include "control.h" #include "mysql_queries.h" #include "stralloc.h" extern int connect_mysql(); extern MYSQL dbh, *mysql; extern MYSQL_RES *result; extern int do_query(stralloc *query, MYSQL_ROW *row); /* qmail-smtpd needs to know if it can accept delivery for this domain */ int rcpthosts_mysql(char *addr, int len) { char *host; int i, at, num, rows; MYSQL_ROW row; stralloc real_host = { 0 }; stralloc real_addr = { 0 }; stralloc qmail_mysql_query = { 0 }; /* maybe the client's so slow we lost the MySQL connection... */ if (! connect_mysql()) return -1; num = len; host = addr + len; while (*host != '@') { host--; num--; if (host == addr) break; } at = num; /* no @ => envnoathost */ if (num == 0) return 1; /* let's lose the @ we found and adjust len */ host++; /* rest of this function adapted from Stephen Hawkins's patch */ if (! stralloc_ready(&real_addr, 2 * (str_len(addr) - at) + 1)) return -1; mysql_escape_string(real_addr.s, addr, at); if (! stralloc_ready(&real_host, 2 * str_len(host) + 1)) return -1; mysql_escape_string(real_host.s, host, str_len(host)); #define ACK {\ stralloc_free(&real_host);\ stralloc_free(&real_addr);\ return -1;\ } #define OOF {\ stralloc_free(&qmail_mysql_query);\ ACK\ } if (! connect_mysql()) ACK len = real_host.len + str_len(RCPTHOSTS) + 2; if (! stralloc_ready(&qmail_mysql_query, len)) ACK if (! stralloc_cats(&qmail_mysql_query, RCPTHOSTS)) OOF if (! stralloc_cats(&qmail_mysql_query, real_host.s)) OOF if (! stralloc_cats(&qmail_mysql_query, "'")) OOF if (! stralloc_0(&qmail_mysql_query)) OOF rows = do_query(&qmail_mysql_query, &row); if (rows < 0) return -1; if (rows == 0) { stralloc_free(&real_host); stralloc_free(&real_addr); return -2; } len = real_addr.len + str_len(real_host.s) + str_len(VIRTUAL) + 2; if (! stralloc_ready(&qmail_mysql_query, len)) ACK if (! stralloc_cats(&qmail_mysql_query, VIRTUAL1)) OOF if (! stralloc_cats(&qmail_mysql_query, real_addr.s)) OOF if (! stralloc_cats(&qmail_mysql_query, VIRTUAL2)) OOF if (! stralloc_cats(&qmail_mysql_query, real_host.s)) OOF if (! stralloc_cats(&qmail_mysql_query, VIRTUAL3)) OOF if (! stralloc_0(&qmail_mysql_query)) OOF stralloc_free(&real_host); stralloc_free(&real_addr); rows = do_query(&qmail_mysql_query, &row); if (rows < 0) return -1; if (rows == 0) return -3; return 1; }