]> git.notmuchmail.org Git - notmuch/blobdiff - test/smtp-dummy.c
emacs: Use `cl-lib' instead of deprecated `cl'
[notmuch] / test / smtp-dummy.c
index fec2b8ad36b765b94abb3255202504f0c9ab926c..1c89e9af81232add629fa49d3f818a096ae27d85 100644 (file)
@@ -121,13 +121,15 @@ main (int argc, char *argv[])
 {
     const char *progname;
     char *output_filename;
-    FILE *peer_file, *output;
-    int sock, peer, err;
+    FILE *peer_file = NULL, *output = NULL;
+    int sock = -1, peer, err;
     struct sockaddr_in addr, peer_addr;
     struct hostent *hostinfo;
     socklen_t peer_addr_len;
     int reuse;
     int background;
+    int ret = 0;
+    socklen_t addrlen;
 
     progname = argv[0];
 
@@ -160,14 +162,16 @@ main (int argc, char *argv[])
     if (output == NULL) {
        fprintf (stderr, "Failed to open %s for writing: %s\n",
                 output_filename, strerror (errno));
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     sock = socket (AF_INET, SOCK_STREAM, 0);
     if (sock == -1) {
        fprintf (stderr, "Error: socket() failed: %s\n",
                 strerror (errno));
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     reuse = 1;
@@ -175,33 +179,49 @@ main (int argc, char *argv[])
     if (err) {
        fprintf (stderr, "Error: setsockopt() failed: %s\n",
                 strerror (errno));
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     hostinfo = gethostbyname ("localhost");
     if (hostinfo == NULL) {
        fprintf (stderr, "Unknown host: localhost\n");
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     memset (&addr, 0, sizeof (addr));
     addr.sin_family = AF_INET;
-    addr.sin_port = htons (25025);
+    addr.sin_port = 0;
     addr.sin_addr = *(struct in_addr *) hostinfo->h_addr;
     err = bind (sock, (struct sockaddr *) &addr, sizeof (addr));
     if (err) {
        fprintf (stderr, "Error: bind() failed: %s\n",
                 strerror (errno));
        close (sock);
-       return 1;
+       ret = 1;
+       goto DONE;
+    }
+
+    addrlen = sizeof (addr);
+    err = getsockname (sock, (struct sockaddr *) &addr, &addrlen);
+    if (err) {
+       fprintf (stderr, "Error: getsockname() failed: %s\n",
+                strerror (errno));
+       close (sock);
+       ret = 1;
+       goto DONE;
     }
 
+    printf ("smtp_dummy_port='%d'\n", ntohs (addr.sin_port));
+
     err = listen (sock, 1);
     if (err) {
        fprintf (stderr, "Error: listen() failed: %s\n",
                 strerror (errno));
        close (sock);
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     if (background) {
@@ -210,13 +230,15 @@ main (int argc, char *argv[])
            printf ("smtp_dummy_pid='%d'\n", pid);
            fflush (stdout);
            close (sock);
-           return 0;
+           ret = 0;
+           goto DONE;
        }
        if (pid < 0) {
            fprintf (stderr, "Error: fork() failed: %s\n",
                     strerror (errno));
            close (sock);
-           return 1;
+           ret = 1;
+           goto DONE;
        }
        /* Reached if pid == 0 (the child process). */
        /* Close stdout so that the one interested in pid value will
@@ -239,21 +261,27 @@ main (int argc, char *argv[])
     if (peer == -1) {
        fprintf (stderr, "Error: accept() failed: %s\n",
                 strerror (errno));
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     peer_file = fdopen (peer, "w+");
     if (peer_file == NULL) {
        fprintf (stderr, "Error: fdopen() failed: %s\n",
                 strerror (errno));
-       return 1;
+       ret = 1;
+       goto DONE;
     }
 
     do_smtp_to_file (peer_file, output);
 
-    fclose (output);
-    fclose (peer_file);
-    close (sock);
+  DONE:
+    if (output)
+       fclose (output);
+    if (peer_file)
+       fclose (peer_file);
+    if (sock >= 0)
+       close (sock);
 
-    return 0;
+    return ret;
 }