Here is a better version....

Index: mail.c
===================================================================
--- mail.c      (revision 1324)
+++ mail.c      (working copy)
@@ -45,7 +45,7 @@
        { "References", "bongo.references" },
        { "X-Auth-OK", "bongo.xauthok" },
        { "List-Id", "bongo.listid" },
-       { "Subject", "bongo.subject" },
+       { "Subject", "nmap.mail.subject" },
        { NULL, NULL }
 };

@@ -70,8 +70,9 @@

        // Parse the mail in a sub-process, as this way we can avoid being
        // blown out of the water if we somehow segfault during processing.
-       pipe(commsPipe);
-
+       //pipe(commsPipe);
+       socketpair(AF_UNIX, SOCK_STREAM, 0, commsPipe);
+
        if ((childpid = fork()) == -1) {
                goto finish;
        }
@@ -85,7 +86,8 @@
                int fd, outstr_size;
                char prop[XPL_MAX_PATH+1];

-               close(commsPipe[0]);
+               /* close the parent side as we are the child */
+               //close(commsPipe[0]);

                // open up the mail
                fd = open(path, O_RDONLY);
@@ -99,17 +101,24 @@
                g_object_unref(parser);

                if (message == NULL) {
+                       /* close our side of the pipe */
+                       close(commsPipe[1]);
+
                        // message didn't parse.
                        exit(-1);
                }
+
+               /* create the wrapper for the child side */
+               Connection *cpipe = ConnAlloc(TRUE);
+               cpipe->socket = commsPipe[1];

                while (headers->header != NULL) {
                        const char *value =
g_mime_object_get_header(GMIME_OBJECT(message),
headers->header);

                        if (value != NULL) {
-                               outstr_size = snprintf(outstr,
sizeof(outstr)-1, "%s\1%s\1",
+                               outstr_size = snprintf(outstr,
sizeof(outstr)-1, "%s\1%s\n",
                                        (char *)headers->propname, (char
*)value);
-                               write(commsPipe[1], outstr, outstr_size);
+                               ConnWrite(cpipe, outstr, outstr_size);
                        }

                        headers++;
@@ -123,56 +132,63 @@
                        prop[XPL_MAX_PATH] = '\0';
                        message->message_id = prop;
                }
-               outstr_size = snprintf(outstr, sizeof(outstr)-1,
"nmap.mail.messageid\1%s\1",
+               outstr_size = snprintf(outstr, sizeof(outstr)-1,
"nmap.mail.messageid\1%s\n",
                        message->message_id);
-               write(commsPipe[1], outstr, outstr_size);
+               ConnWrite(cpipe, outstr, outstr_size);

                header_str =
g_mime_object_get_headers(GMIME_OBJECT(message));

                if (header_str != NULL) {
                        snprintf(prop, XPL_MAX_PATH, FMT_UINT64_DEC,
(uint64_t)strlen(header_str));
-                       outstr_size = snprintf(outstr, sizeof(outstr)-1,
"nmap.mail.headersize\1%s\1", prop);
-                       write(commsPipe[1], outstr, outstr_size);
+                       outstr_size = snprintf(outstr, sizeof(outstr)-1,
"nmap.mail.headersize\1%s\n", prop);
+                       ConnWrite(cpipe, outstr, outstr_size);
                        g_free(header_str);
                }

                // all done, we can quit now
                // FIXME: Why does this crash? : g_object_unref(message);
                close(fd);
+
+               /* clean up */
+               ConnClose(cpipe);
+               ConnFree(cpipe);
+
                exit(0);
        }
+
+       waitpid(childpid, NULL, 0);

+       int nbytes;
+       Connection *spipe = ConnAlloc(TRUE);
+       spipe->socket = commsPipe[0];
+
        // from here, we're the parent - need to get the results from the
        // child.
-       close(commsPipe[1]);
+       //close(commsPipe[1]);

-       int nbytes = read(commsPipe[0], readbuffer, sizeof(readbuffer));
-       // if we don't get anything back, it all failed.
-       if (nbytes < 1) {
-               goto finish;
-       }
-
-       waitpid(childpid, NULL, 0);
-
-       char *responses[] = {0, 0};
-       int response = 1;
-       char *ptr = responses[0] = readbuffer;
-       while (ptr <= readbuffer + nbytes) {
-               if (*ptr == '\1') {
-                       *ptr = '\0';
-                       if (response == 2) {
-                               // we have a key/value pair
-                               response = 0;
-                               if (strlen(responses[1]) > 0)
-                                       SetDocProp(client, document,
responses[0], responses[1]);
-                               if (strcmp(responses[0],
"nmap.mail.subject") == 0) {
-                                       message_subject =
MemStrdup(responses[1]);
+       while ((nbytes = ConnReadLine(spipe, readbuffer,
sizeof(readbuffer))) > 0) {
+               char *ptr = readbuffer, *pair, *end = readbuffer+nbytes;
+
+               while (ptr <= end) {
+                       if (*ptr == '\1') {
+                               *ptr = '\0';
+                               pair = ++ptr;
+
+                               if (*(end-1) == '\n') {
+                                       /* shortcut the rest of the
searching */
+                                       *(end-1) = '\0';
+
+                                       SetDocProp(client, document,
readbuffer, pair);
+
+                                       if (strcmp(readbuffer,
"nmap.mail.subject") == 0) {
+                                               message_subject =
MemStrdup(pair);
+                                       }
                                }
+                               break;
                        }
-                       responses[response] = ptr + 1;
-                       response++;
+
+                       ptr++;
                }
-               ptr++;
        }

        // now, see if we can find a matching conversation
@@ -224,6 +240,8 @@

 finish:
        if (message_subject) MemFree(message_subject);
+       ConnClose(spipe);
+       ConnFree(spipe);

        return result;
 }



> my box would not read the whole buffer out with a single read().  this i
> think fixes that.  seems to work on my lappy.
>
> my original thoughts it was getting encoded wrong were incorrect.  it's
> just how gdb prints when there are non printable ascii chars in the
> string....
>
> Index: mail.c
> ===================================================================
> --- mail.c      (revision 1323)
> +++ mail.c      (working copy)
> @@ -146,35 +146,41 @@
>         // child.
>         close(commsPipe[1]);
>
> -       int nbytes = read(commsPipe[0], readbuffer, sizeof(readbuffer));
> -       // if we don't get anything back, it all failed.
> -       if (nbytes < 1) {
> -               goto finish;
> -       }
> -
>         waitpid(childpid, NULL, 0);
> -
> -       char *responses[] = {0, 0};
> -       int response = 1;
> -       char *ptr = responses[0] = readbuffer;
> -       while (ptr <= readbuffer + nbytes) {
> -               if (*ptr == '\1') {
> -                       *ptr = '\0';
> -                       if (response == 2) {
> -                               // we have a key/value pair
> -                               response = 0;
> -                               if (strlen(responses[1]) > 0)
> -                                       SetDocProp(client, document,
> responses[0], responses[1]);
> -                               if (strcmp(responses[0],
> "nmap.mail.subject") == 0) {
> -                                       message_subject =
> MemStrdup(responses[1]);
> +
> +       int nbytes;
> +       while(1) {
> +               nbytes = read(commsPipe[0], readbuffer,
> sizeof(readbuffer));
> +               // if we don't get anything back, it all failed.
> +               if (nbytes < 0) {
> +                       goto finish;
> +               } else if (nbytes == 0) {
> +                       break;
> +               }
> +
> +               char *responses[] = {0, 0};
> +               int response = 1;
> +               char *ptr = responses[0] = readbuffer;
> +
> +               while (ptr <= readbuffer + nbytes) {
> +                       if (*ptr == '\1') {
> +                               *ptr = '\0';
> +                               if (response == 2) {
> +                                       // we have a key/value pair
> +                                       response = 0;
> +                                       if (strlen(responses[1]) > 0)
> +                                               SetDocProp(client,
> document, responses[0], responses[1]);
> +                                       if (strcmp(responses[0],
> "nmap.mail.subject") == 0) {
> +                                               message_subject =
> MemStrdup(responses[1]);
> +                                       }
>                                 }
> +                               responses[response] = ptr + 1;
> +                               response++;
>                         }
> -                       responses[response] = ptr + 1;
> -                       response++;
> +                       ptr++;
>                 }
> -               ptr++;
>         }
> -
> +
>         // now, see if we can find a matching conversation
>         if (message_subject) {
>                 conversation_data.subject = message_subject;
>
>
> _______________________________________________
> Bongo-devel mailing list
> [email protected]
> https://mail.gna.org/listinfo/bongo-devel
>



_______________________________________________
Bongo-devel mailing list
[email protected]
https://mail.gna.org/listinfo/bongo-devel

Reply via email to