X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=mts%2Fsmtp%2Fsmtp.c;h=b1d57dd6cdb7775072c4e2bbab7c2089e5d29938;hb=8e79ce1919d9cf54f101a812e0fd70a33286b9f3;hp=620dabc547e9c933e1012a6adb6f4bfc3eaced46;hpb=3bede3fae77775088b8b66e7a26a5e2ee1f61fff;p=mmh diff --git a/mts/smtp/smtp.c b/mts/smtp/smtp.c old mode 100644 new mode 100755 index 620dabc..b1d57dd --- a/mts/smtp/smtp.c +++ b/mts/smtp/smtp.c @@ -15,6 +15,13 @@ #ifdef CYRUS_SASL #include #include +# if SASL_VERSION_FULL < 0x020125 + /* Cyrus SASL 2.1.25 introduced the sasl_callback_ft prototype, + which has an explicit void parameter list, according to best + practice. So we need to cast to avoid compile warnings. + Provide this prototype for earlier versions. */ + typedef int (*sasl_callback_ft)(); +# endif /* SASL_VERSION_FULL < 0x020125 */ #include #include #include @@ -100,11 +107,11 @@ static int sm_get_user(void *, int, const char **, unsigned *); static int sm_get_pass(sasl_conn_t *, void *, int, sasl_secret_t **); static sasl_callback_t callbacks[] = { - { SASL_CB_USER, sm_get_user, NULL }, + { SASL_CB_USER, (sasl_callback_ft) sm_get_user, NULL }, #define SM_SASL_N_CB_USER 0 - { SASL_CB_PASS, sm_get_pass, NULL }, + { SASL_CB_PASS, (sasl_callback_ft) sm_get_pass, NULL }, #define SM_SASL_N_CB_PASS 1 - { SASL_CB_AUTHNAME, sm_get_user, NULL }, + { SASL_CB_AUTHNAME, (sasl_callback_ft) sm_get_user, NULL }, #define SM_SASL_N_CB_AUTHNAME 2 { SASL_CB_LIST_END, NULL, NULL }, }; @@ -147,9 +154,9 @@ char *EHLOkeys[MAXEHLO + 1]; * static prototypes */ static int smtp_init (char *, char *, char *, int, int, int, int, int, int, - int, char *, char *, int); + char *, char *, int); static int sendmail_init (char *, char *, int, int, int, int, int, int, - int, char *, char *); + char *, char *); static int rclient (char *, char *); static int sm_ierror (char *fmt, ...); @@ -178,32 +185,33 @@ static int sm_auth_sasl(char *, int, char *, char *); int sm_init (char *client, char *server, char *port, int watch, int verbose, - int debug, int onex, int queued, int sasl, int saslssf, + int debug, int queued, int sasl, int saslssf, char *saslmech, char *user, int tls) { if (sm_mts == MTS_SMTP) return smtp_init (client, server, port, watch, verbose, - debug, onex, queued, sasl, saslssf, saslmech, + debug, queued, sasl, saslssf, saslmech, user, tls); else return sendmail_init (client, server, watch, verbose, - debug, onex, queued, sasl, saslssf, saslmech, + debug, queued, sasl, saslssf, saslmech, user); } static int smtp_init (char *client, char *server, char *port, int watch, int verbose, - int debug, int onex, int queued, + int debug, int queued, int sasl, int saslssf, char *saslmech, char *user, int tls) { + int result, sd1, sd2; #ifdef CYRUS_SASL char *server_mechs; #else /* CYRUS_SASL */ NMH_UNUSED (sasl); + NMH_UNUSED (saslssf); NMH_UNUSED (saslmech); NMH_UNUSED (user); #endif /* CYRUS_SASL */ - int result, sd1, sd2; if (watch) verbose = TRUE; @@ -315,7 +323,7 @@ smtp_init (char *client, char *server, char *port, int watch, int verbose, */ if (! sslctx) { - SSL_METHOD *method; + const SSL_METHOD *method; SSL_library_init(); SSL_load_error_strings(); @@ -385,7 +393,7 @@ smtp_init (char *client, char *server, char *port, int watch, int verbose, } if (sm_debug) { - SSL_CIPHER *cipher = SSL_get_current_cipher(ssl); + const SSL_CIPHER *cipher = SSL_get_current_cipher(ssl); printf("SSL negotiation successful: %s(%d) %s\n", SSL_CIPHER_get_name(cipher), SSL_CIPHER_get_bits(cipher, NULL), @@ -440,8 +448,6 @@ smtp_init (char *client, char *server, char *port, int watch, int verbose, send_options: ; if (watch && EHLOset ("XVRB")) smtalk (SM_HELO, "VERB on"); - if (onex && EHLOset ("XONE")) - smtalk (SM_HELO, "ONEX"); if (queued && EHLOset ("XQUE")) smtalk (SM_HELO, "QUED"); @@ -450,9 +456,12 @@ send_options: ; int sendmail_init (char *client, char *server, int watch, int verbose, - int debug, int onex, int queued, + int debug, int queued, int sasl, int saslssf, char *saslmech, char *user) { + unsigned int i, result, vecp; + int pdi[2], pdo[2]; + char *vec[15]; #ifdef CYRUS_SASL char *server_mechs; #else /* CYRUS_SASL */ @@ -462,9 +471,6 @@ sendmail_init (char *client, char *server, int watch, int verbose, NMH_UNUSED (saslmech); NMH_UNUSED (user); #endif /* CYRUS_SASL */ - unsigned int i, result, vecp; - int pdi[2], pdo[2]; - char *vec[15]; if (watch) verbose = TRUE; @@ -530,10 +536,8 @@ sendmail_init (char *client, char *server, int watch, int verbose, vec[vecp++] = watch ? "-odi" : queued ? "-odq" : "-odb"; vec[vecp++] = "-oem"; vec[vecp++] = "-om"; -# ifndef RAND if (verbose) vec[vecp++] = "-ov"; -# endif /* not RAND */ vec[vecp++] = NULL; setgid (getegid ()); @@ -614,8 +618,6 @@ sendmail_init (char *client, char *server, int watch, int verbose, } #endif /* CYRUS_SASL */ - if (onex) - smtalk (SM_HELO, "ONEX"); if (watch) smtalk (SM_HELO, "VERB on"); @@ -638,33 +640,9 @@ rclient (char *server, char *service) } int -sm_winit (int mode, char *from) +sm_winit (char *from) { - char *smtpcom = NULL; - - switch (mode) { - case S_MAIL: - smtpcom = "MAIL"; - break; - - case S_SEND: - smtpcom = "SEND"; - break; - - case S_SOML: - smtpcom = "SOML"; - break; - - case S_SAML: - smtpcom = "SAML"; - break; - - default: - /* Hopefully, we do not get here. */ - break; - } - - switch (smtalk (SM_MAIL, "%s FROM:<%s>", smtpcom, from)) { + switch (smtalk (SM_MAIL, "MAIL FROM:<%s>", from)) { case 250: sm_addrs = 0; return RP_OK; @@ -791,7 +769,7 @@ sm_end (int type) int status; struct smtp sm_note; - if (sm_mts == MTS_SENDMAIL) { + if (sm_mts == MTS_SENDMAIL_SMTP) { switch (sm_child) { case NOTOK: case OK: @@ -956,7 +934,8 @@ sm_auth_sasl(char *user, int saslssf, char *mechlist, char *inhost) memset(&secprops, 0, sizeof(secprops)); secprops.maxbufsize = SASL_MAXRECVBUF; - secprops.max_ssf = tls_active ? 0 : (saslssf != -1 ? saslssf : UINT_MAX); + secprops.max_ssf = + tls_active ? 0 : (saslssf != -1 ? (unsigned int) saslssf : UINT_MAX); result = sasl_setprop(conn, SASL_SEC_PROPS, &secprops); @@ -1137,12 +1116,12 @@ static int sm_get_pass(sasl_conn_t *conn, void *context, int id, sasl_secret_t **psecret) { - NMH_UNUSED (conn); - char **pw_context = (char **) context; char *pass = NULL; int len; + NMH_UNUSED (conn); + if (! psecret || id != SASL_CB_PASS) return SASL_BADPARAM; @@ -1518,7 +1497,7 @@ sm_rrecord (char *buffer, int *len) buffer[*len = 0] = 0; if ((retval = sm_fgets (buffer, BUFSIZ, sm_rfp)) != RP_OK) - return retval; + return sm_rerror (retval); *len = strlen (buffer); /* *len should be >0 except on EOF, but check for safety's sake */ if (*len == 0)