]> diplodocus.org Git - nmh/blobdiff - mts/smtp/smtp.c
Ignore the sign mismatch warning when sbr/dtimep.c is built with
[nmh] / mts / smtp / smtp.c
old mode 100644 (file)
new mode 100755 (executable)
index 00df119..6fd178b
 #ifdef CYRUS_SASL
 #include <sasl/sasl.h>
 #include <sasl/saslutil.h>
+# 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 <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -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,22 +185,22 @@ 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;
@@ -441,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");
 
@@ -451,7 +456,7 @@ 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;
@@ -531,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 ());
@@ -615,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");
 
@@ -797,9 +798,19 @@ sm_end (int type)
            if (sm_mts == MTS_SMTP)
                smtalk (SM_QUIT, "QUIT");
            else {
+               /* The SIGPIPE block replaces old calls to discard ().
+                  We're not sure what the discard () calls were for,
+                  maybe to prevent deadlock on old systems.  In any
+                  case, blocking SIGPIPE should be harmless.
+                  Because the file handles are closed below, leave it
+                  blocked. */
+               sigset_t set, oset;
+               sigemptyset (&set);
+               sigaddset (&set, SIGPIPE);
+               sigprocmask (SIG_BLOCK, &set, &oset);
+
                kill (sm_child, SIGKILL);
-               discard (sm_rfp);
-               discard (sm_wfp);
+               sm_child = NOTOK;
            }
            if (type == NOTOK) {
                sm_reply.code = sm_note.code;
@@ -839,9 +850,11 @@ sm_end (int type)
        if (sasl_inbuffer)
            free(sasl_inbuffer);
 #endif /* CYRUS_SASL */
-    } else {
+    } else if (sm_child != NOTOK) {
        status = pidwait (sm_child, OK);
        sm_child = NOTOK;
+    } else {
+       status = OK;
     }
 
     sm_rfp = sm_wfp = NULL;