/* Public domain */ #ifdef HAVE_PERL #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_BOUNDED_ATTRIBUTE #define BOUNDED_ATTRIBUTE(t, a, b) __attribute__((__bounded__ (t,a,b))) #else #define BOUNDED_ATTRIBUTE(t, a, b) #endif #ifdef HAVE_FORMAT_ATTRIBUTE #define FORMAT_ATTRIBUTE(t, a, b) __attribute__((__format__ (t,a,b))) #else #define FORMAT_ATTRIBUTE(t, a, b) #endif #ifdef HAVE_NONNULL_ATTRIBUTE #define NONNULL_ATTRIBUTE(a) __attribute__((__nonnull__ (a))) #else #define NONNULL_ATTRIBUTE(a) #endif #ifdef HAVE_PACKED_ATTRIBUTE #define PACKED_ATTRIBUTE __attribute__((__packed__)) #else #define PACKED_ATTRIBUTE #endif typedef u_int Uint; typedef unsigned long Ulong; #include "queue.h" #include "table.h" #include "fgetln.h" #include "strlcpy.h" #include "strlcat.h" #include "config.h" #ifndef MPD_SMTP_MAXSOCKETS #define MPD_SMTP_MAXSOCKETS 5 /* Enough for common IPv4+IPv6 */ #endif #define MPD_ERROR_MAX 512 extern char mpdErrorMessage[MPD_ERROR_MAX]; static __inline__ void MPD_SetError(const char *fmt, ...) { char tmp[512]; va_list ap; va_start(ap, fmt); vsnprintf(tmp, sizeof(tmp), fmt, ap); va_end(ap); strlcpy(mpdErrorMessage, tmp, sizeof(mpdErrorMessage)); } static __inline__ void MPD_SetErrorS(const char *s) { strlcpy(mpdErrorMessage, s, sizeof(mpdErrorMessage)); } static __inline__ char * MPD_GetError(void) { return (mpdErrorMessage); } #include "sockunion.h" #include "maillist.h" #include "message.h" #include "sa.h" #include "smtp.h" #include "qmgr.h" #include "local.h" #include "policy.h" #include "control.h" #include "spamcheck.h" #define Malloc(len) MPD_Malloc(len) #define Free(p) if ((p) != NULL) free(p) #define Fatal MPD_Fatal #ifdef DEBUG #define Debug MPD_Debug #else #define Debug(arg...) ((void)0) #endif #ifdef HAVE_SETPROCTITLE #define Setproctitle setproctitle #else #define Setproctitle(arg...) ((void)0) #endif #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) typedef socklen_t my_socklen_t; #else typedef int my_socklen_t; #endif typedef enum { MPD_NONE, MPD_AND, MPD_OR } MPD_LogicOp; #ifdef HAVE_PERL extern PerlInterpreter *my_perl; #endif extern int mpdSoftFail, mpdMaxWorkers, mpdCleanupInterval; extern char *mpdHome, *mpdSafePath, *mpdSafeShell, *mpdSocketDir; extern char *saUserConfDir, *saUserPrefs; extern int saSocketBacklog, saMaxProcMsgs, saMaxIdle, saLearning, saMaxSize; extern char *mpdHostSMTP, *mpdPortSMTP; extern int mbdReportEnable; extern char *mbdHost, *mbdPort, *mbdPass; extern char *forceFilterDomains; extern float forceFilterThreshold; extern FILE *mpdLog; void MPD_Debug(const char *, ...); void *MPD_Malloc(size_t); void MPD_Fatal(const char *, ...); void MPD_SetError(const char *, ...); char *MPD_GetError(void); void MPD_EnterServerProc(const char *); void MPD_ExitServerProc(int); #ifdef HAVE_FLOCK #define LockFile(fd) flock((fd),LOCK_EX) #define UnlockFile(fd) flock((fd),LOCK_UN) #else #define LockFile(fd) (void)(0) #define UnlockFile(fd) (void)(0) #endif #define Unlink(path) do { \ if (unlink(path) == -1) \ syslog(LOG_ERR, "unlink %s: %s", path, strerror(errno)); \ } while(0) static __inline__ int ValidEmailAddress(const char *addr) { const char *c; int at = 0; int dots = 0; for (c = &addr[0]; *c != '\0'; c++) { if (*c == '@') { at++; continue; } if (*c == '.') { if (c[1] == '.') { return (0); } dots++; continue; } if (!isalnum(*c) && *c != '_' && *c != '-' && *c != '+' && *c != ' ') { return (0); } } if (at != 1 || dots < 1) { return (0); } return (1); }